前言:
今天看官们对“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的自动加载机制