2015-01-04 28 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中的数据。