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 到現有的程式上。
參考資料
相關文章:
- Zend Framework 1.8 Released
- Zend Framework 1.5 Release
- Zend_Paginator
- Zend Framework 1.7 Release
- Zend Framework 1.7
Related posts brought to you by Yet Another Related Posts Plugin.
五月 13th, 2009 at 11:35 上午
写得非常好!支持一下!
七月 29th, 2009 at 4:53 下午
因为Zend_Loader_Autoloader第一次单件调用后其才会调用spl_autoload_register(array(__CLASS__, ‘autoload’)); 对其进行自动载入的注册. 所以没有调用自动加载就会不好用.