PHP的autoload自动加载机制使用说明
2015-01-24信息快讯网
自PHP5后,引入了__autoload这个拦截器方法,可以自动对class文件进行包含引用,下面看具体的使用方法。
在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来,但是这样可能会使得在引用文件的新脚本中,存在大量的include或require方法调用,如果一时疏忽遗漏则会产生错误,使得代码难以维护。自PHP5后,引入了__autoload这个拦截器方法,可以自动对class文件进行包含引用,通常我们会这么写:
function __autoload($className) { include_once $className . '.class.php'; } $user = new User();
当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 = new User_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'; } //加载我 function autoload($className) { $file = str_replace('/', DIRECTORY_SEPARATOR, $className); include_once $file . '.php'; } //开始加载 spl_autoload_register('autoload'); $userRegister = new User_Register();
在使用spl_autoload_register()的时候,我们还可以考虑采用一种更安全的初始化调用方法,参考如下:
//系统默认__autoload函数 function __autoload($className) { include_once $className . '.class.php'; } //可供SPL加载的__autoload函数 function autoload($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 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性
PHP 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
PHP乱码问题,UTF-8乱码常见问题小结
php 的加密函数 md5,crypt,base64_encode 等使用介绍
PHP中SESSION使用中的一点经验总结
PHP __autoload()方法真的影响性能吗?
MySQL的FIND_IN_SET函数使用方法分享
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
TMDPHP 模板引擎使用教程
php中使用cookie来保存用户登录信息的实现代码
php _autoload自动加载类与机制分析
PHP __autoload函数(自动载入类文件)的使用方法
PHP函数spl_autoload_register()用法和__autoload()介绍
php 无法加载mysql的module的时候的配置的解决方案引发的思考
PHP spl_autoload_register实现自动加载研究
php中通过虚代理实现延迟加载的实现代码
纯php打造的tab选项卡效果代码(不用js)
php的ajax框架xajax入门与试用介绍
几款免费开源的不用数据库的php的cms
PHP操作XML作为数据库的类
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
PHP与MySQL开发的8个技巧小结
hessian 在PHP中的使用介绍
snoopy 强大的PHP采集类使用实例代码
php printf输出格式使用说明
php购物网站支付paypal使用方法
php下使用iconv需要注意的问题
php include加载文件两种方式效率比较
php自动加载的两种实现方法
php面向对象全攻略 (十七) 自动加载类