PHP的autoload自动加载机制使用说明
2023-06-13 09:14:26 时间
在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来,但是这样可能会使得在引用文件的新脚本中,存在大量的include或require方法调用,如果一时疏忽遗漏则会产生错误,使得代码难以维护。
自PHP5后,引入了__autoload这个拦截器方法,可以自动对class文件进行包含引用,通常我们会这么写:
复制代码代码如下:
自PHP5后,引入了__autoload这个拦截器方法,可以自动对class文件进行包含引用,通常我们会这么写:
function__autoload($className){
include_once$className.".class.php";
}
$user=newUser();
当PHP引擎试图实例化一个未知类的操作时,会调用__autoload()方法,在PHP出错失败前有了最后一个机会加载所需的类。因此,上面的这段代码执行时,PHP引擎实际上替我们自动执行了一次__autoload方法,将User.class.php这个文件包含进来。
在__autoload函数中抛出的异常不能被catch语句块捕获并导致致命错误。
如果使用PHP的CLI交互模式时,自动加载机制将不会执行。
当你希望使用PEAR风格的命名规则,例如需要引入User/Register.php文件,也可以这么实现:
//加载我
function__autoload($className){
$file=str_replace("_",DIRECTORY_SEPARATOR,$className);
include_once$file."php";
}
$userRegister=newUser_Register();
这种方法虽然方便,但是在一个大型应用中如果引入多个类库的时候,可能会因为不同类库的autoload机制而产生一些莫名其妙的问题。在PHP5引入SPL标准库后,我们又多了一种新的解决方案,spl_autoload_register()函数。
此函数的功能就是把函数注册至SPL的__autoload函数栈中,并移除系统默认的__autoload()函数。一旦调用spl_autoload_register()函数,当调用未定义类时,系统会按顺序调用注册到spl_autoload_register()函数的所有函数,而不是自动调用__autoload()函数,下例调用的是User/Register.php而不是User_Register.class.php:
//不加载我
function__autoload($className){
include_once$className.".class.php";
}
//加载我
functionautoload($className){
$file=str_replace("/",DIRECTORY_SEPARATOR,$className);
include_once$file.".php";
}
//开始加载
spl_autoload_register("autoload");
$userRegister=newUser_Register();
在使用spl_autoload_register()的时候,我们还可以考虑采用一种更安全的初始化调用方法,参考如下:
//系统默认__autoload函数
function__autoload($className){
include_once$className.".class.php";
}
//可供SPL加载的__autoload函数
functionautoload($className){
$file=str_replace("_",DIRECTORY_SEPARATOR,$className);
include_once$file.".php";
}
//不小心加载错了函数名,同时又把默认__autoload机制给取消了……?
spl_autoload_register("_autoload",false);
//容错机制
if(false===spl_autoload_functions()){
if(function_exists("__autoload")){
spl_autoload_register("__autoload",false);
}
}
奇技淫巧:在Unix/Linux环境下,如果你有多个规模较小的类,为了管理方便,都写在一个php文件中的时候,可以通过以ln-s命令做软链接的方式快速分发成多个不同类名的拷贝,再通过autoload机制进行加载。
相关文章
- Php面试问题_php面试常问面试题
- 如何使用PHP连接MySQL数据库(php如何关联mysql)
- PHP实现将数组插入MySQL数据库(php数组插入mysql)
- 和 php 如何配合使用Redis类库搭配PHP编程:高效开发与灵活操作(redis类库)
- 部署PHP应用:Linux服务器上的挑战(linux部署php)
- php在Linux上使用Yaf框架开发PHP应用(yaflinux)
- 使用PHP和MySQL精心构建表单(php表单mysql)
- 库学会使用PHP操作MSSQL类库,輕鬆完成高效工作(php操作mssql类)
- 使用PHP测试Redis的最佳实践(php测试redis)
- 使用PHP连接Linux,轻松实现物联网设备管理。(php连接linux)
- PHP配置指南:MySQL编码设置详解(php设置mysql编码)
- PHP中使用Redis简单取值(redis取值php)
- 如何使用MySQL快速查询PHP数组(mysql查询数组php)
- 构建LAMP环境 以增加PHP的MSSQL扩展(增加php扩展mssql)
- MySQL PHP长连接:持久化提升应用性能(mysql php长连接)
- 使用PHP连接MSSQL数据库的实例示范(php连接mssql例子)
- 解决PHP读取MSSQL数据库乱码问题(php读mssql乱码)
- PHP如何支持使用MS SQL 进行数据库操作(php怎么还用mssql)
- 让PHP连接MSSQL数据库的正确方式(php如何连mssql)
- 使用PHP和MySQL研究论文(php mysql 论文)
- 深入学习Linux下的PHP编程技巧(linux下php编程)
- 如何在PHP中使用MySQL数据库(mysql中php)
- 中的应用使用Redis,提升PHP程序效率(redis缓存在php)
- 不重新编译PHP为php增加openssl模块的方法
- php教程插件机制在PHP中实现方案
- php实现自动获取生成文章主题关键词功能的深入分析