關於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的預設實現函式
----------------------------------------------------------------------------------------------------------------------------------------------
看來是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');//放在入口檔案最上面