我正在用PHP创建一个ORM,我有一个类'ORM',它基本上创建了一个对应于数据库表的对象(我的目标是与ActiveRecord模式类似/相同的功能。)ORM本身扩展了'Database',它建立了数据库连接。
所以,我可以致电:
$c = new Customer();
$c->name = 'John Smith';
$c->save();
ORM类提供此功能(设置类属性,提供save(),find(),findAll()等方法),Customer扩展ORM。但是,将来我可能想要向Customer(或我创建的任何其他模型)添加额外的公共方法,那么这是否应该扩展ORM?
我知道我这里没有提供太多信息,但希望这可以理解为模糊的解释,而不是发布300多行代码。
答案 0 :(得分:3)
我同意其他答案 - 将其他方法放入后代课程中。我还要为它添加一个星号:每次使用额外的方法扩展类时,请考虑使用扩展程序尝试实现的内容,并考虑是否可以将其推广并重新使用到父类中。例如:
// 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
}
答案 1 :(得分:2)
您当然正在考虑将您的业务逻辑放在“ORM”之外的新课程中。对我而言,只需简单地扩展ORM类,我宁愿用一个新的值对象类封装它,以便为数据库设计提供额外的自由度,让您将该类视为一个纯粹的业务对象。
答案 2 :(得分:2)
不。您应该使用组合而不是继承。请参阅以下示例:
class Customer {
public $name;
public function save() {
$orm = new ORM('customers', 'id'); // table name and primary key
$orm->name = $this->name;
$orm->save();
}
}
并且ORM
类不应该扩展Database
。组合再次最适合此用例。
答案 3 :(得分:1)
是的,将您的业务逻辑放在后代类中。这是大多数数据访问层生成框架中常见的模式。
答案 4 :(得分:0)
你绝对应该扩展ORM类。不同的东西应该是不同类的对象。客户与产品非常不同,并且在单个ORM类中支持两者都将是不必要的膨胀并完全违背OOP的目的。
另一件好事是在保存之前,保存之后添加钩子等。这些为您提供了更大的灵活性,因为您的ORM扩展类变得更加多样化。
答案 5 :(得分:0)
鉴于我对PHP的了解有限,我不确定这是否相关,但如果您尝试创建许多业务对象,这可能是一个非常耗时的过程。也许您应该考虑CakePHP等框架以及其他类似框架。如果您仍在创建业务逻辑的过程中,这很好。
答案 6 :(得分:0)
我在Pork.dbObject中已经解决了这个问题。一定要检查一下,并抓住我已经做过的一些braincrunching: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
}
请注意,这样,任何数据库或ORM功能都会从Poll对象中抽象出来。它不需要 来了解。只是用于连接字段/映射的setupdatabase。和addRelation将关系连接到其他dbObjects。
此外,即使dbObject类对SQL也不太了解。选择/连接查询由特殊的QueryBuilder对象构建。
答案 7 :(得分:0)
你肯定在这里继续思考继承权。
如果你只是为了构建一个ORM而构建一个ORM(或者因为你不喜欢别人处理事物的方式)而不是为了它,那么你可能会看到一个可以生成你的大部分内容的预构建ORM代码直接来自您的数据库架构。它会为你节省大量的时间。 CoughPHP目前是我最喜欢的。