源起
借來一本書,《PHP&MySQL範例精解——建立、修改、重用》。雖然是2008年出版的老書,但對與我這樣的新手來說還是挺有協助的,畢竟那些基本的設計思想是不會過時的。
目錄結構設計
書中說,在開發過程中第一步是設計程式的目錄結構。建議建立三個主資料夾,分別用來:
- public_files:儲存可以公用訪問的頁面;
- lib:儲存可以被其他檔案調用的引用檔案;
- templates:儲存頁面顯示檔案。
Web伺服器只允許訪問public_files下的檔案,如此一來可以增強系統的安全性。
資料庫設計
將使用次數很少甚至只有一次的資料單獨存放在一個表中並及時刪除,以避免資料冗餘。例如,此書就將使用者啟用相關的資訊單獨放在了一個表中。因為這些資訊只在啟用時用到一次,用完即刪。
編寫共用代碼
將共用程式碼及連結資料庫的代碼分別存在在一個檔案中,增加代碼的重用度,方便其他檔案調用。
User類的設計
在MVC思想中該部分屬於model的設計。在設計一個類的時候應牢記,在物件導向編程中,對象即對應著生活中的實體。類的屬性用於描述對象,而類的方法則用於直接操作對象或者做一些與該對象相關的操作。對於一個使用者類而言,首先要有使用者ID、使用者名稱、密碼等這些使用者資訊,是為該類的屬性。再者,我們需要對使用者進行尋找、建立、更新資訊、啟用等操作,於是便有與之對應的方法來完成這些操作。
屬性的重載
此書使用了重載的放鬆來動態地建立屬性。這樣做的好處是若以後要新增一些屬性幾乎不用對代碼作出改動,直接調用這些需要添加的屬性,就行了。利用重載來動態建立屬性與直接再代碼中添加一個新的屬性是不一樣的。屬性的重載利用了魔術方法__get()和__set()。在給不可訪問屬性(未定義或不可見)賦值時,__set()會被調用;在讀取不可訪問屬性的值時__get()會被調用。一般通過__set()將重載的屬性的資料儲存到一個私人數組欄位中,需要讀取重載的屬性時又通過__get()從這個私人數組欄位中讀取。範例程式碼如下:
class User{ private $uid; private $field; //initialize a User object public function __construct() { $this->uid = null; $this->field = array('username' => '', 'password' => '', 'emailAddr' => '', 'isActive' => false); } //override magic method to retrieve properties public function __get($field) { if($field == 'userId'){ return $this->uid; }else{ return $this->field[$field]; } } //override magic method to set properties public function __set($field, $value) { if(array_key_exists($field, $this->field)){ $this->field[$field] = $value; } }}
需要注意的是PHP中的重載與其他語言的不同。其他語言的重載一般是指同函數名稱不同參數個數從而實現同名的多個函數。關於PHP重載的更多內容見PHP手冊:重載
對資料進行驗證
在對資料進行處理之前需要對資料進行驗證。當資料驗證為是我們期望的那樣之後再對資料進行處理。否則可能會出現不可預知的錯誤。新手往往可能會忽視這一點。例如在PHP的代碼中經常會出現檢測某個量是否為空白,若非空再進行操作。
動態SQL語句
實現尋找、儲存等方法是需要用到動態SQL語句。此書通過sprintf()函數來實現。sprintf()函數類似與C#中的String.Format()。然而這種方式略繁瑣,個人感覺目前會有更好的方式。當使用sprintf()函數實現動態SQL時,對於較複雜的字串參數需要使用real_escape_string()函數進行轉義,以確保代碼的安全性。(編碼問題貌似一般和SQL注入有關)。
模板
使用模板可以將邏輯和頁面設計分離。此書在這裡使用了一個簡單的模板:將頁面各個部分的內容儲存到$GLOBALS數組中,模板檔案在各個部分直接輸出數組的內容。因此若想動態展示頁面,只需修改$GLOBALS中的內容,再展示模板檔案即可。
結語
本文是一篇簡單的學習筆記,主要是協助自己整理思路,如果能對其他人也有一些協助就更好了~【用markdown寫東西確實也挺爽的