PHP自动加载机制详解(附带实例)
虽然命名空间可以解决命名冲突的问题,但是每次导入时,需要采用 include、require、include_once 或 require_once 手动引入文件。如果不小心忘记引入某个文件,程序就会出错。
为了解决上述问题,PHP 提供了自动加载机制,用户可以根据需求自动加载对应的文件。本节将对自动加载进行详细讲解。
spl_autoload_register() 函数的基本语法格式如下:
注册自动加载的函数还可以是匿名函数,示例代码如下:
下面演示使用 spl_autoload_register() 函数注册自动加载函数。创建 autoload01.php 文件,具体代码如下:
通过浏览器访问 autoload01.php 文件,运行结果为:
需要注意的是,如果第 1 个自动加载函数加载后,类可以使用,则第 2 个自动加载函数将不会执行。
例如,创建 autoload02.php 文件,具体代码如下:
下面演示注册静态方法和非静态方法,示例代码如下:
为了解决上述问题,PHP 提供了自动加载机制,用户可以根据需求自动加载对应的文件。本节将对自动加载进行详细讲解。
PHP注册自动加载函数
PHP 提供的 spl_autoload_register() 函数用于完成注册自动加载函数的功能。用户可以将自定义的函数注册为自动加载函数,当 PHP 脚本试图使用尚未被定义的函数时,会执行自动加载函数,在这个函数中完成加载操作。spl_autoload_register() 函数的基本语法格式如下:
bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )在上述语法格式中:
- 第 1 个参数 $autoload_function 表示待注册的自动加载函数;
- 第 2 个参数 $throw 用于设置自动加载函数注册失败时是否抛出异常,默认为 true,表示抛出异常;
- 第 3 个参数 $prepend 用于设置注册的自动加载函数添加到队列的开头还是结尾,默认为 false,表示添加到队尾。
注册自动加载的函数还可以是匿名函数,示例代码如下:
spl_autoload_register(function ($classname) { // 在此处编写自动加载处理代码 });从上述示例代码可知,将匿名函数的函数体直接写在以上示例代码中注释的位置,也可以实现注册自动加载函数。
下面演示使用 spl_autoload_register() 函数注册自动加载函数。创建 autoload01.php 文件,具体代码如下:
<?php use myframe\Container; function loader($classname) { $filename = substr($classname, strrpos($classname, '\\') + 1); $filename = $filename . '.php'; if (is_file($filename)) { require $filename; } } spl_autoload_register('loader'); echo Container::student(); // 自动加载Container类,调用student()静态方法在上述代码中:
- 第 4~11 行代码用于定义 loader() 函数,该函数的参数 $classname 表示要加载的类;
- 第 6 行代码用于提取参数中的类名;
- 第 7 行代码用于根据类名拼接出文件名;
- 第 8~10 行代码用于引入类文件;
- 第 12 行代码将 loader() 函数注册为自动加载函数;
- 第 13 行代码使用 Container 类时,由于类不存在,会执行 loader() 函数,加载类文件。
通过浏览器访问 autoload01.php 文件,运行结果为:
App\Http\Controllers\StudentController
PHP注册多个自动加载函数
使用 spl_autoload_register() 函数还可以注册多个自动加载函数。当需要自动加载时,这些自动加载函数会按照注册的顺序依次执行,直到注册完成为止。需要注意的是,如果第 1 个自动加载函数加载后,类可以使用,则第 2 个自动加载函数将不会执行。
例如,创建 autoload02.php 文件,具体代码如下:
<?php spl_autoload_register(function ($classname) { echo '第1个自动加载函数', '<br>'; }); spl_autoload_register(function ($classname) { echo '第2个自动加载函数', '<br>'; });通过浏览器访问 autoload02.php 文件,运行结果为:
第1个自动加载函数
第2个自动加载函数
PHP注册自动加载方法
除了注册自动加载函数外,还可以将指定的方法注册为自动加载方法。注册自动加载方法时,静态方法和非静态方法的语法不同,具体语法格式如下:// 注册静态方法 spl_autoload_register(['类名', '方法名']); spl_autoload_register('类名::方法名'); // 注册非静态方法 spl_autoload_register([对象, '方法名']);在上述语法格式中,注册静态方法的参数可以是数组和字符串的形式,注册非静态方法的参数只能是数组形式。
下面演示注册静态方法和非静态方法,示例代码如下:
<?php class Auto { public static function load01($classname) { /* 处理自动加载的代码*/ } public function load02($classname) { /* 处理自动加载的代码*/ } } // 注册静态方法 spl_autoload_register(['Auto', 'load01']); // 注册方式1 spl_autoload_register('Auto::load01'); // 注册方式2 // 注册非静态方法 $auto = new Auto(); spl_autoload_register([$auto, 'load02']);在上述示例代码中:
- 第 13~14 行代码将 Auto 类中的静态方法 load01() 注册为自动加载方法;
- 第 17 行代码将 Auto 类中的非静态方法 load02() 注册为自动加载方法。