龙空技术网

PHP自动加载文件机制学习

码农辉哥 34

前言:

今天看官们对“php自动加载机制”都比较注意,同学们都想要学习一些“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自动加载机制 #php加载更多 #php加载动态库 #php加载模块 #php的自动加载机制