規範|開發指南
FleaPHP 的命名規則和目錄結構初看上去比較複雜,但習慣以後,你會發現這種命名規則帶來許多好處。因此像 Zend Framework 也是採用同樣的做法。
當然,FleaPHP 對於應用程式的命名規則和目錄結構沒有強制性要求。只不過採用一致的命名規則和目錄結構,可以方便對應用程式維護。同時 FleaPHP 應用程式開發人員之間也可以更容易的進行協作。
全域函數的命名規則
全域函數的命名規則是用“_”分隔全小寫單詞。例如 get_cache()、echo_h()。同時,函數的名字採用“動詞+賓語”的形式。例如 write(動詞)_cache(賓語)。
不過有些全域函數為了和 PHP 中已有的類似函數保持一致,採用了不同的命名方式(順便抱怨一下,PHP 自身的全域函數命名比較混亂,各種形式的都有)。
類的命名規則
所有 FleaPHP 內建的類,都以 FLEA_ 開頭。然後根據用途命名。例如 FLEA_Controller_Action、FLEA_Helper_ImgCode。然後將類名字中的“_”替換為目錄分隔字元,就是這個類的定義檔案所在位置。
舉例:
FLEA_Controller_Action 類,儲存檔案為 FLEA/Controller/Action.php
FLEA_Db_TableDataGateway 類,儲存檔案為 FLEA/Db/TableDataGateway.php
這種命名規則和目錄結構的優缺點如下:
優點:
- 避免命名衝突
- 根據類名字就能找到檔案存放位置
- 應用程式中可以使用 FleaPHP 的 import()、load_class() 函數方便的載入類定義檔案
- 如果使用 PHP5,可以很方便的用 __autoload() 來自動載入需要的類定義:
<?phpfunction __autoload($className) { load_class($className);}?>
缺點:
- 類名字較長,不便於輸入,例如 FLEA_Com_RBAC_UsersManager
- 也許和現有習慣不同,需要時間來適應
對於第一個缺點,使用 Zend Development Environment 或者 Eclipse 這樣的 IDE 可以緩解。這些 IDE 提供強大的輸入自動完成功能,通常輸入類名字的開頭幾個字母,就會顯示候選列表讓開發人員選擇。
變數和常量命名
在 FleaPHP 中,變數分為全域變數、臨時變數和模版變數三類。
- 全域變數和常量
全域變數和常量都使用全大寫,以“_”分隔。例如 $GLOBALS['CLASS_PATH'] 和 FLEA_DIR。不過 FleaPHP 中盡量避免了使用全域變數和常量,因此一般來說不會和應用程式產生衝突。
- 臨時變數
函數、類方法中使用的變數都是臨時變數,命名規則是第一個單詞小寫,後續的單詞第一個字母大寫。例如 $requestFilters、$dispatcherClass 等。
- 模版變數
之所以要把模版變數單獨列出來,是因為不同的模版引擎對變數名有不同的規範。從我個人來說,我傾向於模版變數使用全小寫單詞,並以“_”分隔,例如 $latest_products_list。這樣在程式裡面一眼就能看出哪些變數是用於模版的。
FleaPHP 的目錄結構
一個典型的 FleaPHP 應用程式具有如下的目錄結構:
這個應用程式的目錄主要分為 WebLibs 和 WebRoot。其中 WebLibs 儲存程式的所有代碼,而 WebRoot 目錄下只儲存使用者可以訪問的部分,例如 index.php 入口檔案、圖片、CSS 樣式表和 JS 指令碼。
WebLibs 下又分為 FLEA 和 YORK 兩個目錄。FLEA 目錄儲存 FleaPHP 的核心檔案,而 YORK 目錄儲存應用程式的代碼。之所以取名 YORK,是因為這個項目的公司名為 YORK。所以開發人員在規劃目錄結構時,可以參照這種方式,為儲存應用程式代碼的目錄取一個容易理解的名字。
WebRoot 是儲存使用者使用瀏覽器可以直接存取的內容,因此需要修改伺服器或虛擬機器主機設定,將網站的根目錄指向 WebRoot 目錄。例如 www.example.com 指向 /example/WebRoot/。
這裡介紹的目錄結構有如下優點:
優點:
- 代碼檔案放置在瀏覽器訪問不到的地方,提高了安全性
- 程式員和設計人員可以在不同的目錄工作,降低了發生衝突的幾率
- 目錄結構更清晰,容易理解
而主要的缺點就是需要修改伺服器設定,將網站根目錄指向 WebRoot 目錄。而有些虛擬機器主機不允許這樣做,或者需要聯絡伺服器管理員,比較麻煩。
對於這種目錄結構,放置在 WebRoot 中的 index.php 入口檔案應該明確調用 import() 將 WebLibs 目錄添加到類定義搜尋路徑中。否則 load_class() 會找不到需要的檔案。
<?phprequire('../WebLibs/FLEA/FLEA.php');import('../WebLibs/YORK/');....run();?>
對於虛擬機器主機使用者,可以將 WebLibs 目錄移動到 WebRoot 目錄中。形成如下的目錄結構:
上圖中,所有檔案都儲存在應用程式的根目錄 cdhlss 中,而代碼檔案儲存在 libs 子目錄中。其中 libs/APP 儲存應用程式的代碼。
相應的 index.php 需要修改為:
<?phprequire('libs/FLEA/FLEA.php');import('libs/APP/');....run();?>
在實際開發中,由於 FleaPHP 並沒有強制要求命名規範和目錄結構。所以開發人員可以繼續沿用自己熟悉的方式來開發應用程式。