加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP的autoload自动加载机制使用说明

发布时间:2020-12-13 05:48:55 所属栏目:PHP教程 来源:网络整理
导读:在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来,但是这样可能会使得在引用文件的新脚本中,存在大量的include或require方法调用,如果一时疏忽遗漏则会产生错误,使得代码难以维护。自PH

在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来,但是这样可能会使得在引用文件的新脚本中,存在大量的include或require方法调用,如果一时疏忽遗漏则会产生错误,使得代码难以维护。自PHP5后,引入了autoload这个拦截器方法,可以自动对class文件进行包含引用,通常我们会这么写:
<div class="codetitle"><a style="CURSOR: pointer" data="23176" class="copybut" id="copybut23176" onclick="doCopy('code23176')"> 代码如下:<div class="codebody" id="code23176">
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文件,也可以这么实现:
<div class="codetitle"><a style="CURSOR: pointer" data="14890" class="copybut" id="copybut14890" onclick="doCopy('code14890')"> 代码如下:<div class="codebody" id="code14890">
//加载我
function
autoload($className) {
$file = strreplace('',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:
<div class="codetitle"><a style="CURSOR: pointer" data="92863" class="copybut" id="copybut92863" onclick="doCopy('code92863')"> 代码如下:<div class="codebody" id="code92863">
//不加载我
function autoload($className) {
include_once $className . '.class.php';
}
//加载我
function autoload($className) {
$file = str_replace('/',$className);
include_once $file . '.php';
}
//开始加载
spl_autoload_register('autoload');
$userRegister = new User_Register();
在使用spl_autoload_register()的时候,我们还可以考虑采用一种更安全的初始化调用方法,参考如下:
<div class="codetitle"><a style="CURSOR: pointer" data="32384" class="copybut" id="copybut32384" onclick="doCopy('code32384')"> 代码如下:<div class="codebody" id="code32384">
//系统默认
autoload函数
function __autoload($className) {
include_once $className . '.class.php';
}
//可供SPL加载的
autoload函数
function autoload($className) {
$file = strreplace('',$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机制进行加载。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读