您的位置:首页 > 编程语言 > PHP开发

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

2012-06-02 19:59 232 查看
问题:

今天我在完善自己的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');//放在入口文件最上面
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: