我应该扩大这节课吗? (PHP)
我正在用PHP创建一个ORM,并且有一个类'ORM',该类基本上创建一个与数据库表相对应的对象(我的目标是与ActiveRecord模式相似/相同的功能。)ORM本身扩展了'数据库",用于建立数据库连接。
所以,我可以打电话给:
$c = new Customer(); $c->name = 'John Smith'; $c->save();
`
ORM类提供此功能(设置类属性,提供save(),find(),findAll()等方法),然后客户扩展ORM。但是,将来我可能想向客户(或者我创建的任何其他模型)添加额外的公共方法,那么这是否应该扩展ORM?
我知道我在这里没有提供太多信息,但是希望通过模糊的解释是可以理解的,而不是发布300多行代码。
解决方案
是的,将业务逻辑放在子孙类中。这是在大多数数据访问层生成框架中看到的非常常见的模式。
我们当然在正确地考虑将业务逻辑放在" ORM"之外的新类中。对我而言,与其简单地扩展ORM类,不如将其封装在一个新的,有价值的对象类中,以提供数据库设计额外的自由度,从而使我们可以将类视为纯粹的业务对象。
我们应该绝对扩展ORM类。不同的事物应该是不同类别的对象。客户与产品截然不同,并且在一个ORM类中同时支持这两个产品将是不必要的,并且完全无法达到OOP的目的。
另一个不错的事情是在保存之前,保存之后等添加钩子。随着ORM扩展类变得越来越多样化,它们为我们提供了更大的灵活性。
鉴于我对PHP的了解有限,所以不确定是否与此相关,但是如果我们要创建许多业务对象,那么这可能是一个非常耗时的过程。也许我们应该考虑使用CakePHP之类的框架以及其他类似的框架。如果我们仍在创建业务逻辑的过程中,这很好。
我同意这里的其他答案,将其他方法放入后代类中。不过,我还要在其中添加一个星号:每次我们使用额外的方法扩展该类时,请考虑我们想通过该扩展实现什么,并考虑是否可以将其泛化并重新用于父类中。例如:
// Customer.class.php function getByName($name) { // SELECT * FROM `customer` WHERE `name` = $name } // ** this could instead be written as: ** // ORM.class.php function getByField($field, $value) { // SELECT * FROM `$this->table` WHERE `$field` = $value }
没有。我们应该使用组合而不是继承。请参见以下示例:
class Customer { public $name; public function save() { $orm = new ORM('customers', 'id'); // table name and primary key $orm->name = $this->name; $orm->save(); } }
ORM类不应该扩展数据库。同样,此组合最适合此用例。
我已经在Pork.dbObject中解决了这个问题。确保检查出来并抓住我已经做过的一些令人讨厌的事情:P
class Poll extends dbObject // dbObject is my ORM. Poll can extend it so it gets all properties. { function __construct($ID=false) { $this->__setupDatabase('polls', // db table array('ID_Poll' => 'ID', // db field => object property 'strPollQuestion' => 'strpollquestion', 'datPublished' => 'datpublished', 'datCloseDate' => 'datclosedate', 'enmClosed' => 'enmclosed', 'enmGoedgekeurd' => 'enmgoedgekeurd'), 'ID_Poll', // primary db key $ID); // primary key value $this->addRelation('Pollitem'); //Connect PollItem to Poll 1;1 $this->addRelation('Pollvote', 'PollUser'); // connect pollVote via PollUser (many:many) } function Display() { // do your displayíng for poll here: $pollItems = $this->Find("PollItem"); // find all poll items $alreadyvoted = $this->Find("PollVote", array("IP"=>$_SERVER['REMOTE_ADDR'])); // find all votes for current ip }
请注意,通过这种方式,可以从Poll对象中抽象出任何数据库或者ORM功能。它不需要知道。只需setupdatabase即可连接字段/映射。和addRelation来将关系连接到其他dbObject。
而且,即使dbObject类也不了解SQL。选择/联接查询由特殊的QueryBuilder对象构建。
我们肯定会在这里沿着正确的方向考虑继承问题。
如果我们只是为了构建一个ORM(或者因为我们不喜欢其他人处理事物的方式)而构建ORM,那么我们可能会看一看预生成的ORM,它可以直接从中生成大多数代码数据库架构。这样可以节省大量时间。 CoughPHP目前是我的最爱。