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 ,也期盼大家能一起分享更多的學習心得。



Posted by jaceju at 樂多Roodo! │16:40 │回應(10)Zend Framework
樂多分類:網路/3C 共同主題:PHP 程式設計 工具:編輯本文
Ads by Roodo! 
回應文章
看到你這篇...有一點恍然大悟的感覺...
透視 WebMVC
目前我寫的方法和你的
轉換思考模式
這個方法有點類似..
我是index.php?action=xxx&page=xxx
剛好最近也一直在思考這個架構的問題
直到看到你的這篇...
就有點體悟....
anyway 感謝你這篇文章的啟發
Posted by johnpupu at 2008年04月1日 19:30

不好意思..不知道這個問題該發在那篇比較好
想請問Jace你
不知道你們在用ZF 的時後有把db 做讀寫分離這部份嗎
我看了一陣子...若是單純的用$db->fetchall 之類的
我想這部份可以自已做到讀寫分離
$db_read->fetchAll();
$db_write->insert();

不過在$use = New Users();
$user->fetchAll($select);
$user->name = 'johnpupu';
$user->save();
的情況下 不知道你們這方面的 讀寫分離是否有解??
Posted by johnpupu at 2008年08月26日 17:29

@johnpupu:

還沒遇到要分離的情況,但我想可以在 save 的時候,動態改變 table 物件的 $_db 屬性,然後再呼叫 parent::save() 。

不過沒試過,你可能要自行試一下囉。
Posted by jaceju at 2008年08月26日 17:32

恩~~我剛剛在試..
不過他的_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 你的指導 ^^
Posted by johnpupu at 2008年08月26日 19:17
前輩您好,最近在學習 Zend Framework,在無意間發現你整理好的 Wacow Framework,覺得架構十分有條理,可是在撰寫 Controller_Action 上卻無法理解開發方法,可否提供較具實務的範例,期待您的回復。
Posted by weskerjax at 2008年11月23日 21:42

@weskerjax:

WF 基本上就是再把 ZF 包裝一下而已 (幫你定義好了目錄結構) 。基本的 Controller_Action 觀念就是「透視 WebMVC 」裡談到的。

在 ZF 的官方手冊裡有一張圖提到了完整的 Controller 執行流程,你不妨參考看看:)
Posted by jaceju at 2008年11月24日 11:55
感謝前輩的告知
目前已經解決問題了
努力學習中
Posted by weskerjax at 2008年11月25日 00:47

請問一下(透視WebMVC )留言板如何轉換mysql資料庫.
Posted by 小輝 at 2008年11月26日 16:53
好文章~

我最近開始用Zend Framework,發現他提供MVC架構 + 方便處理DB + 方便的Form的驗證輸入限制,真的很不錯。

【問題請教】
不過昨天遇到Jquery使用上有些helper動作不正常,像是autoComplete和spinner無法運作,但是ajaxLink和datePicker正常。

檢查後發現Jquery and Jquery Ui似乎沒有包含autoComplete和spinner的function, 是否需要自行安裝額外的jquery plugin才能執行?

另外,國內有Zend Framework的大本營嗎? 很難找到人討論說~
Posted by BB at 2009年01月23日 23:14
上一篇沒說清楚,補充一下

Zend Framework 1.7提供Jquery的整合
我發問的問題是指使用Zend Framework裡的Jquery helper發生的,我懷疑有些功能光靠Zend Framework預設的jquery + jquery ui還不夠,需要額外的plugin
Posted by BB at 2009年01月23日 23:18