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() 注册为自动加载方法。
ICP备案:
公安联网备案: