2008年03月31日
[PHP-ZF] 如何學習 Zend Framework
今天又被問到怎麼開始學 Zend Framework ,我是覺得要上手並不難,但是基礎一定要有。
那麼哪些東西算是基礎呢?當然 HTML 、 JavaScript (Ajax) 或 CSS 等必備技能就不必多說了;以下我介紹幾個我個人認為滿重要的部份以及學習的次序:
- 物件導向
-
學習 Zend Framework 時,絕大部份時間你一定會接觸到物件導向,因此物件導向的基本觀念是一定要有的;否則你在運用 ZF 的各種套件時,一定會陷入困惑的泥沼中。
至於物件導向的三大要素:封裝、繼承和多型,詳細的說明在書本或網路有很多,我就不在這裡野人獻曝囉。這裡推薦:「深入淺出 Java 程式設計」,其中幾章的物件導向概念值得一讀。
- 設計模式
-
有了物件導向的觀念後,我強烈建議去瞭解設計模式,因為在 Zend Framework 的套件在設計上用到了許多設計模式。而且我個人也認為適當運用設計模式,能讓我們的程式更強固且具有彈性。
不過我很難用明確的字眼去表達設計模式是什麼東西,那遠遠超出我的能力範圍。因此我推薦這本:「深入淺出設計模式」,它簡單易懂的範例與說明,看完後保證你在物件導向上的功力能增進一甲子。
- MVC 概念
-
MVC 觀念常常是傳統 PHP 開發者所不瞭解的,因為如果能快速把工作完成,誰會想去搞一個看起來那麼複雜的玩意兒?但是 MVC 在運用得當的情況下,卻能讓程式的意圖更加清晰,而且也更容易維護。
事實上 MVC 也是設計模式的一種,而上面那本書裡裡也有提到,建議大家參考看看。不過 Zend Framework 的 WebMVC 在實作上的概念上有稍有不同,我個人自薦這篇:「透視 WebMVC 」;該文會告訴你如何將舊有的 PHP 專案轉換成 MVC 架構。
- PHP5
-
由於 Zend Framework 在開發上採用了 PHP5 的特性,所以 PHP5 也變成學習 Zend Framework 時最重要的基礎之一。而 PHP5 在物件導向也著墨甚多,在語法上也參考 Java 的許多特點,學過 Java 的朋友一定倍感親切。
參考資料方面我個人推薦官方手冊的 PHP5 的 Classes and Objects 一節,另外還有 Standard PHP Library (SPL) Functions 。
- 一定的開發經驗
-
Zend Framework 已經幫我們把很多東西都包裝好了,因此我們很多時候都可以不用重造輪子。但是它只是個工具,而且也不是萬能的,因此有些東西還是需要靠你自己來;所以對於 Web 開發你就必須要有一定程度的瞭解,至少你得曾經獨力完成一個以上的專案。
- 入門教學
-
假設以上你都有了一定的基礎,那麼你還需要臨門的一腳。一篇好的入門文章絕對是你學習 Zend Framework 必要的利器之一,因為它能快速帶你進入 Zend Framework 的世界裡。
這裡就不能不提 Rob Allen 寫的文章了,這篇「 Getting Started with Zend Framework 」是學習 Zend Framework 的你一定要載回來仔細研究的好文!不過官方也提供了一篇 Quick Start ,你可以將它和 Rob Allen 的文章交互參考看看 (我個人覺得 Rob 的比較完整) 。
- 參考手冊與源代碼
-
如果你已經入門了,那可別鬆懈。因為 Zend Framework 裡面有許多好用的工具,只是看你懂不懂得去運用而已;所以官方的參考手冊和 API 說明是一定要去看的。而源代碼更是重要,因為當官方手冊的範例或 API 說明明顯不足時,你可以從源代碼裡挖出一些不為人知的秘技,更可以學到許多高深的技巧!
當然以上的基礎不是絕對的,這僅僅是我個人的一些建議而已。希望這篇簡單的說明能幫助大家順利學習 Zend Framework ,也期盼大家能一起分享更多的學習心得。
看到你這篇...有一點恍然大悟的感覺...透視 WebMVC
目前我寫的方法和你的
轉換思考模式
這個方法有點類似..
我是index.php?action=xxx&page=xxx
剛好最近也一直在思考這個架構的問題
直到看到你的這篇...
就有點體悟....
anyway 感謝你這篇文章的啟發

不好意思..不知道這個問題該發在那篇比較好
想請問Jace你
不知道你們在用ZF 的時後有把db 做讀寫分離這部份嗎
我看了一陣子...若是單純的用$db->fetchall 之類的
我想這部份可以自已做到讀寫分離
$db_read->fetchAll();
$db_write->insert();
不過在$use = New Users();
$user->fetchAll($select);
$user->name = 'johnpupu';
$user->save();
的情況下 不知道你們這方面的 讀寫分離是否有解??
@johnpupu:
還沒遇到要分離的情況,但我想可以在 save 的時候,動態改變 table 物件的 $_db 屬性,然後再呼叫 parent::save() 。
不過沒試過,你可能要自行試一下囉。

恩~~我剛剛在試..
不過他的_db是protected的
剛剛在"Table/Row/Abstract.php"裡面看他的save
method 有看到_update , _postUpdate
想說可以從這邊下手的....
很開心的在這邊
protected function _update()
{
$registry = Zend_Registry::getInstance();
$db_write = $registry->get('db_write');
Zend_Db_Table::setDefaultAdapter($db_write);
}
不過殘念....
至於_db屬性的話..他是protected 動不了...
現在想到的是...從
Adapter/Abstract.php
去改
function query()
$this->_config['dbname'] = 'db_read';
目前看起來是可行..
不過動到ZF 的Code 是最不想的方式。
感謝Jace 你的指導 ^^
前輩您好,最近在學習 Zend Framework,在無意間發現你整理好的 Wacow Framework,覺得架構十分有條理,可是在撰寫 Controller_Action 上卻無法理解開發方法,可否提供較具實務的範例,期待您的回復。@weskerjax:
WF 基本上就是再把 ZF 包裝一下而已 (幫你定義好了目錄結構) 。基本的 Controller_Action 觀念就是「透視 WebMVC 」裡談到的。
在 ZF 的官方手冊裡有一張圖提到了完整的 Controller 執行流程,你不妨參考看看:)
請問一下(透視WebMVC )留言板如何轉換mysql資料庫.
好文章~我最近開始用Zend Framework,發現他提供MVC架構 + 方便處理DB + 方便的Form的驗證輸入限制,真的很不錯。
【問題請教】
不過昨天遇到Jquery使用上有些helper動作不正常,像是autoComplete和spinner無法運作,但是ajaxLink和datePicker正常。
檢查後發現Jquery and Jquery Ui似乎沒有包含autoComplete和spinner的function, 是否需要自行安裝額外的jquery plugin才能執行?
另外,國內有Zend Framework的大本營嗎? 很難找到人討論說~
上一篇沒說清楚,補充一下Zend Framework 1.7提供Jquery的整合
我發問的問題是指使用Zend Framework裡的Jquery helper發生的,我懷疑有些功能光靠Zend Framework預設的jquery + jquery ui還不夠,需要額外的plugin
