PHP 是一種面向對象的服務端語言,它具有眾多的模型編寫方式,其中常用的有兩種:Active Record 和 Data Mapper。
Active Record 模型與數(shù)據(jù)庫中的表一一對應,會將業(yè)務邏輯和數(shù)據(jù)操作混合在同一個類中。一個典型的 Active Record 模型類如下:
class User extends ActiveRecord\Model { static $has_many = array( array('posts') ); static $validates_presence_of = array( array('name'), array('email') ); }
上面這個例子展示了使用 Active Record 模型來描述“用戶”實體的例子。通過使用 ActiveRecord\Model 類,可以輕松定義數(shù)據(jù)訪問和驗證規(guī)則。使用 $has_many 屬性定義了用戶與多篇文章之間的關聯(lián),$validates_presence_of 屬性則定義了 name 和 email 兩個屬性必須出現(xiàn)在 User 對象中。
而如果我們采用 Data Mapper 編寫模型,通常會將數(shù)據(jù)存儲的操作與訪問邏輯分離,使得業(yè)務邏輯和數(shù)據(jù)操作分開來。下面是一個典型的 Data Mapper 模型類:
class User { private $db; private $table = 'users'; function __construct() { $this->db = new PDO('mysql:host=localhost;dbname=mydb', 'username', 'password'); } function getById($id) { $stmt = $this->db->prepare('SELECT * FROM ' . $this->table . ' WHERE id = :id'); $stmt->execute(array(':id' =>$id)); $result = $stmt->fetch(PDO::FETCH_ASSOC); return $result ? new User($result) : null; } }
在上面這個例子中,我們使用 Data Mapper 模型將與數(shù)據(jù)庫交互的代碼封裝在一個 getById() 方法中。注意這個方法并沒有被定義在 ActiveRecord\Model 類中,而是在一個普通的 PHP 類中執(zhí)行數(shù)據(jù)操作。使用 Data Mapper 模型可以使代碼更加靈活,同時降低了代碼的耦合性。
綜上所述,Active Record 模型與 Data Mapper 模型各有優(yōu)劣。選擇什么樣的模型往往取決于具體的業(yè)務需求和技術限制。不過,在實踐中,我們通常會選擇 Active Record 模型來編寫小到中等規(guī)模的應用程序,而對于大型復雜的應用程序,則更適合使用 Data Mapper 模型。