您的位置 首页 php

PHP自动加载文件机制学习

PHP中要去实例化一个类时,需要先将类文件加载进来,常用的加载语句是include_once或require_once,这两个语句每次只能加载一个文件,当一个业务模块需要实例化多个不同类时,每个类文件都要写加载语句,这样写起来过于繁琐,那么 spl_autoload_register 函数完全可以帮我们解决这个问题。

函数原型

 spl_autoload_register(callable $autoload_function = ?, bool $throw = true, bool $prepend = false): bool  

此函数用于注册一个自定义类文件加载函数,当代码访问一个不存在的类名时,会触发自定义函数,该函数接收一个类名参数,我们可以根据类名,动态加载响应的类文件。

参数说明:

autoload_function :要注册的自动加载的函数,可以是回调函数方式,也可以是某个类的方法。

throw :此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。

prepend :如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部,当注册多个自定义加载函数时,可以提升优先级。

示例

回调函数方式

 spl_autoload_register(function($className) {
    //自动加载代码
}, true, true);  

静态类方式

 class MyAutoloader {
    public static function loader($className) {
        //自动加载代码
    }
}
spl_autoload_register([MyAutoloader::class, 'loader'], true, true);  

完整示例

假设我们以命名空间前缀作为加载规则,如:PersonModel.php文件位于Model目录,命名空间为Model,命名空间路径要与文件目录保持一致,代码如下:

 namespace Model;

class PersonModel {
    public function getName() {
        return "zhangsan";
    }
}  

自动加载类文件

 class MyAutoloader {
    public static function loader($className) {
        $path = '';
        $className = trim($className, '\\');

        if (false !== ($pos = strpos($className, '\\'))) {
            $path = substr($className, 0, $pos);
            $className = substr($className, $pos + 1);
        }

        require_once "." . DIRECTORY_SEPARATOR . $path . DIRECTORY_SEPARATOR . $className . '.php';
    }
}

spl_autoload_register([MyAutoloader::class, 'loader'], true, true);  

主入口文件

 //引入自动加载文件
require_once "./autoloader.php";
//通过自动加载引入类文件
$person = new \Model\PersonModel();
//正常打印输出
echo $person->getName();  

总结

自动加载需要有统一的命名规则,目前最常用的是按命名空间方式加载,早期没有命名空间时,一般按文件名后缀区分文件所在目录,从而实现不同模块文件加载,现在主流框架已经使用composer管理类库,普通用户无需关心这些加载规则,此文章主要用于学习文件加载原理及流程。

文章来源:智云一二三科技

文章标题:PHP自动加载文件机制学习

文章地址:https://www.zhihuclub.com/148866.shtml

关于作者: 智云科技

热门文章

网站地图