我应该扩大这节课吗? (PHP)

时间:2020-03-06 14:51:17  来源:igfitidea点击:

我正在用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目前是我的最爱。