2

我在 PHP 中创建了一个 ORM,我有一个类“ORM”,它基本上创建了一个与数据库表相对应的对象(我的目标是与 ActiveRecord 模式相似/相同的功能。)ORM 本身扩展了' Database',用于建立数据库连接。

所以,我可以打电话:

$c = new Customer();
$c->name = 'John Smith';
$c->save();

ORM 类提供此功能(设置类属性,提供 save()、find()、findAll() 等方法),Customer 扩展 ORM。但是,将来我可能希望向 Customer(或我创建的任何其他模型)添加额外的公共方法,那么这是否应该扩展 ORM?

我知道我在这里没有提供太多信息,但希望这可以通过模糊的解释来理解,而不是发布 300 多行代码。

4

8 回答 8

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
}
于 2008-09-29T01:04:17.883 回答
2

您肯定正确地考虑将您的业务逻辑放在您的“ORM”之外的一个新类中。对我来说,与其简单地扩展 ORM 类,我更愿意用一个新的值对象类来封装它,以便为您的数据库设计提供额外的自由度,让您可以将类视为纯业务对象。

于 2008-09-28T23:28:33.243 回答
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。组合再次最适合此用例。

于 2008-09-29T01:56:32.640 回答
1

是的,将您的业务逻辑放在后代类中。这是在大多数数据访问层生成框架中看到的非常常见的模式。

于 2008-09-28T23:07:23.670 回答
0

您绝对应该扩展 ORM 类。不同的事物应该是不同类的对象。客户与产品有很大不同,在单个 ORM 类中同时支持两者将是不必要的膨胀,并完全违背了 OOP 的目的。

另一个不错的做法是为保存前、保存后等添加挂钩。随着您的 ORM 扩展类变得更加多样化,这些为您提供了更大的灵活性。

于 2008-09-29T00:10:10.477 回答
0

鉴于我对 PHP 的了解有限,我不确定这是否相关,但如果您尝试创建许多业务对象,这可能是一个非常耗时的过程。也许您应该考虑像CakePHP和其他类似的框架。如果您仍在创建业务逻辑的过程中,这很好。

于 2008-09-29T00:14:01.683 回答
0

我已经在我的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
}

请注意,通过这种方式,任何数据库或 ORM 功能都从 Poll 对象中抽象出来。它不需要知道。只是用于连接字段/映射的 setupdatabase。和 addRelation 连接到其他 dbObjects 的关系。

此外,即使是 dbObject 类也不太了解 SQL。选择/连接查询是由一个特殊的 QueryBuilder 对象构建的。

于 2008-09-29T06:39:38.277 回答
0

你肯定在这里沿着正确的路线思考继承。

如果您构建 ORM 只是为了构建一个(或者因为您不喜欢其他人处理事情的方式)而不是去做,否则您可能会查看一个可以直接生成大部分代码的预构建 ORM您的数据库架构。它将为您节省大量时间。CoughPHP目前是我的最爱。

于 2008-09-29T07:37:01.480 回答