问题:
今天我在完善自己的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');//放在入口文件最上面