首页 > 编程笔记 > PHP笔记 阅读:8

PHP自动加载机制详解(附带实例)

虽然命名空间可以解决命名冲突的问题,但是每次导入时,需要采用 include、require、include_once 或 require_once 手动引入文件。如果不小心忘记引入某个文件,程序就会出错。

为了解决上述问题,PHP 提供了自动加载机制,用户可以根据需求自动加载对应的文件。本节将对自动加载进行详细讲解。

PHP注册自动加载函数

PHP 提供的 spl_autoload_register() 函数用于完成注册自动加载函数的功能。用户可以将自定义的函数注册为自动加载函数,当 PHP 脚本试图使用尚未被定义的函数时,会执行自动加载函数,在这个函数中完成加载操作。

spl_autoload_register() 函数的基本语法格式如下:
bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $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()静态方法
在上述代码中:
通过浏览器访问 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']);
在上述示例代码中:

相关文章