學習 PHP5 語言動態性的入門文章
從 PHP4 到 PHP5 , PHP 不只改善了個體 (object) 的成員保護程度,也引入了 PHP 稱為「magic methods」的特殊行為。 Magic methods 提昇了 PHP 的動態性,活用 magic methods 可以大幅減少程式碼中類似的重覆行為,並為 programmer 帶來更開放與直觀的程式撰寫彈性。
日前在 developerWorks 搜到了一篇介紹 magic methods 的好文章,《Going dynamic with PHP - Add flexibility to your application with dynamic objects》。作者藉由程式重整 (refactoring) 的方式,逐步將舊式的 php code 以 PHP v5 的語法功能改寫,使讀者在重整過程中體會新語法之動態性帶來的優點。
Magic methods 的概念在動態語言如 Python, Ruby, PHP 之中很普遍,應用最廣的是 getter, setter 和 caller (在 C++/Java/C# 則尚未在語言層級中予以充分支援。)。《Classes and Objects (PHP 5)::Overloading》說明了這三種行為在 PHP 中的使用方式與時機。
於《Going dynamic with PHP》一文中,作者一開始先用舊式語法實作了一個資料表類別 Book ,接著覆載 __call
method ,將資料表成員的存取行為動態化,再覆載 __get, __set
methods ,將資料表成員的存取行為內隱化 (implicationalization)。
// Before overloading setter and getter, you write: book->setTitle('my book'); // After overloading setter and getter, you write: book->title = 'my book'; // The setter and getter have be called implicitly.
運用 magic methods 重整 (refactor) 程式碼的結果,使我們從一個用途有限的 Book 類別中精煉出一個泛用的 DBObject 類別。這是一個符合 CRUD 典型 (Create, Read, Update, Delete 是四種資料基本存取行為,幾乎所有資料表類別都會實作這四種行為,從中發展出 ORM 的 pattern/form 實踐方式) 的資料表類別,而且它不是一個抽象類別 (abstract class)。這意味著我們可以直接用 DBObject 映射一個新增的資料表,而不需描述其細節 (不用多寫宣告與定義的程式碼)。儘管在引入 magic methods 之前,我們仍然可以實踐 CRUD 樣式,但無法用如此簡潔的程式碼完成這份工作。