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

所以,我可以致电:

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

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

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

有帮助吗?

解决方案

我同意其他答案 - 将其他方法放入后代课程中。我还要为它添加一个星号:每次使用额外的方法扩展类时,请考虑使用扩展程序尝试实现的内容,并考虑是否可以将其推广并重新使用到父类中。例如:

// 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
}

其他提示

您当然正在考虑将您的业务逻辑放在“ORM”之外的新课程中。对我而言,只需简单地扩展ORM类,我宁愿用一个新的值对象类封装它,以便为数据库设计提供额外的自由度,让您将该类视为一个纯粹的业务对象。

不。您应该使用组合而不是继承。请参阅以下示例:

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 。组合再次最适合此用例。

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

你绝对应该扩展ORM类。不同的东西应该是不同类的对象。客户与产品非常不同,并且在单个ORM类中支持两者都将是不必要的膨胀并完全违背OOP的目的。

另一件好事是在保存之前,保存之后添加钩子等。这些为您提供了更大的灵活性,因为您的ORM扩展类变得更加多样化。

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

你肯定在这里继续思考继承权。

如果你只是为了构建一个ORM而构建一个ORM(或者因为你不喜欢别人处理事物的方式)而不是为了它,那么你可能会看到一个可以生成你的大部分内容的预构建ORM代码直接来自您的数据库架构。它会为你节省大量的时间。目前我最喜欢 CoughPHP

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

我已经在我的 Pork.dbObject 中解决了这个问题。一定要检查一下,并抓住我已经做过的一些braincrunching:P

<*>

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

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

SERVER['REMOTE_ADDR'])); // find all votes for current ip }

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top