1. 程式人生 > >關於php的類自動裝載機制__autoload

關於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');//放在入口檔案最上面