2015-01-04 71 views
1

我一直在試圖找到一個實體類的例子,以確保我應該放入它。有人能給我一個關於這樣一個班怎麼樣的例子嗎?PHP實體類示例

  1. 該對象是否只包含數據,就像我可以簡單地使用StdClass對象? 還是應該包含我的CRUD方法呢? (創建,讀取,更新,刪除)

  2. 對於我的數據庫或模型中的每一行創建實體類的實例,還是應該使用一個實體類並保存全部實體類的數組屬性中的不同行?

+1

對於你想要做的事情,MVC可能是更好的方法。看看[Laravel](http://laravel.com/),這是一個非常強大的MVC結構化框架。 – Svenskunganka 2015-01-04 14:18:18

+1

@Sune,這取決於你的確切目標是什麼。我傾向於使用[域對象](http://c2.com/cgi/wiki?DomainObject),它們由自定義編寫的[數據映射器](http://martinfowler.com/eaaCatalog/dataMapper.html)填充, 。你真的不應該將這些實體與持久化邏輯混合在一起,否則你最終會得到[active record](http://www.martinfowler.com/eaaCatalog/activeRecord.html)反模式。 – 2015-01-04 22:06:56

回答

0

作爲一名評論者指出,使用MVC框架將是緩解事情的最佳方式。或使用Doctrine2的廣告列表 - 一個ORM(它將PHP類映射到數據庫表並執行所有查詢)。

但是,爲了回答你的questiosn:

  1. 應該爲每個實體(表)不同的類。應該contian 廣告列表 CRUD方法,但可以包含相關方法的其他數據(「條」實體可能包含getBodyLinks()方法,將解析身體,並返回所有的URL。

  2. 每個實體是...還有一個實體,如果你因爲某些原因不想對象實例的浮動你周圍的負載應該會更「低水平」比實體

的Symfony2 + Doctrine2例如:。

https://github.com/stfalcon/BlogBundle/blob/master/Entity/Post.php

(這只是一些隨機回購我在GitHub上找到)

1

在我的最後一個項目我分開實體映射(CRUD操作),所以它看起來是這樣的:

實體

Class PostEntity 
{ 
    public $title; 
    public $text; 
} 

映射

Class PostMapper 
{ 
    public function load($id) 
    { 
     // load one record from Database where id = $id 
    } 

    public function save() 
    { 
     // insert new record or edit in Database 
    } 

    public function delete() 
    { 
     // delete from Database 
    } 
} 

用法 - 1實體

$postMapper = new PostMapper(); 
$post = $postMapper->load(1); // load from Database where post_id = 1 
$post->title = "New title"; // set new post title 
$postMapper->save($post); // edit post in Database 

用法 - 主體多元化

$postMapper = new PostMapper(); 
$posts = $postMapper->loadAllFromCategory(2); // load from Database where cateogory_id = 1 
foreach ($posts as $post) { 
    echo "<h3>" . $post->title . "</h3>"; 
} 

所以,在我的例子實體是 「愚蠢」 的變量集合(從數據庫列表)和setters/getters(可選),而Mapper做所有的數據庫工作(CRUD)。如果我想更改映射器以從外部XML獲取結果,我只需創建類加載XML中的數據。