Autoload in ZF 1.8

最近 Zend Framework 推出了 1.8 Release, 除了許多新功能以外,原有的功能也做了一些改變。對原有的project來說,如果沒用到新功能的部份,那放著不管是沒關係的,可是舊功能的改變卻可能影響到原本程式的行為,所以反而要更注意。

Zend_Loader_Autoloader 的功用(目的)

  • 提供真正的namespace autoloader (之前是不區分namespace的)
  • 提供註冊任意個數的callback 函式作為 autoload function, 其中是以 stack 的方式運作。這是為了克服 PHP 5標準的 spl_autoload 只允許一個 callback function 的問題。
  • 允許最佳化的 namespace 比對方式,提高解析類別的速度。


原本的 autoload 是這樣用的 (最簡單的情況)

require_once('Zend/Loader.php');
Zend_Loader::registerAutoload();

在 ZF 1.8 要改成

require_once('Zend/Loader/Autoloader.php');
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);

這適用於函式庫中沒有自己加的 namepsace,所以會使用預設的 Zend_ 跟 ZendX_,這也是 Zend Framework 中 class 所使用的 prefix ,這首先讓 Zend Framework 內的 class 能夠自動被載入。而 setFallbackAutoloader(true) 則是讓寫在 include_path 中,又沒有的 namespace 的 class 能被載入,這通常會是在 models/ 之中的檔案。

不過這邊有一點相當奇怪,假設我沒有 model,不需要 setFallbackAutoloader(true),那麼就應該不需要執行 getInstance()而一樣可以使用 Zend_ 跟 ZendX_ 的類別,但實際上如果我只有 require_once(‘Zend/Loader/Autoloader.php’) 的話,我之後還是不能使用 Zend_* 的類別,這部份還不清楚是 Zend_Loader_Autoloader 的 bug 還是 spl_autoload 的問題。

新版的改進其實還有 Zend_Tool 跟 Zend_Application 可以用,這部份之後再來研究,先把 Autoload 這部份 Apply 到現有的程式上。

參考資料

相關文章:

Related posts brought to you by Yet Another Related Posts Plugin.

2 Responses to “Autoload in ZF 1.8”

  1. 游客 Says:

    写得非常好!支持一下!

  2. silvester Says:

    因为Zend_Loader_Autoloader第一次单件调用后其才会调用spl_autoload_register(array(__CLASS__, ‘autoload’)); 对其进行自动载入的注册. 所以没有调用自动加载就会不好用.

Leave a Reply