关于php的类自动装载机制__autoload

问题:

     今天我在完善自己的MVC框架时候,由于框架采用的是类自动装载机制,用到了__autoload函数,开始一切工作正常。

当我把smarty注入到框架后,发现框架不能运行了,致命错误提示找不到××类,取消smarty注入,框架恢复正常,我就肯定是Smarty中也使用了__autoload函数,当我在Smarty所有文件搜索一番无果,于是Google一下“php 关闭__autoload”看看什么会导致__autoload失效,发现一个函数spl_autoload_register

我立即在Smarty所有文件中搜索spl_autoload_register,哈哈在Smarty.class.php发现这个函数,代码片段如下:(85行左右)

if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false) {

    $registeredAutoLoadFunctions = spl_autoload_functions();

    if (!isset($registeredAutoLoadFunctions['spl_autoload'])) {

        spl_autoload_register();

    }

} else {

    spl_autoload_register('smartyAutoload');

}

看不太明白,拿出秘籍(php5.3手册)翻看发现这个函数与自动加载机制密切相关,手册说明如下:

spl_autoload_register — 注册__autoload()函数

说明bool   spl_autoload_register  ([  $autoload_function  ] )

将函数注册到SPL __autoload函数栈中。如果该栈中的函数尚未激活,则激活它们。

如果在你的程序中已经实现了__autoload函数,它必须显式注册到__autoload栈中。因为 spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload()或spl_autoload_call()。 

参数

autoload_function

欲注册的自动装载函数。如果没有提供任何参数,则自动注册autoload的默认实现函数spl_autoload() 

----------------------------------------------------------------------------------------------------------------------------------------------

看来是Smarty调了 spl_autoload_register();导致自动注册autoload的默认实现函数spl_autoload,那么前面我的__autoload函数就失效了,

只有用spl_autoload_register显示的注册自己的autoload函数就能避免。

随即我就spl_autoload_register('__autoload'); 发现即使注入Smarty框架也正常运行了。

看着spl_autoload_register('__autoload');别扭

我就一不做二不休:

function myAutoload($class_name)

{

××××××

}

spl_autoload_register('myAutoload');//放在入口文件最上面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值