Php 我应该延长这门课吗?(菲律宾)

Php 我应该延长这门课吗?(菲律宾),php,oop,orm,activerecord,Php,Oop,Orm,Activerecord,我正在用PHP创建一个ORM,我有一个类“ORM”,它基本上创建了一个与数据库表对应的对象(我的目标是实现与ActiveRecord模式类似/相同的功能)。ORM本身扩展了“数据库”,它设置了数据库连接 因此,我可以调用:$c=newcustomer(); $c = new Customer(); $c->name = 'John Smith'; $c->save(); $c->name='John Smith'; $c->save() ORM类提供了此功能(设置类属性,提供save()、fin

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

因此,我可以调用:
$c=newcustomer();
$c = new Customer();
$c->name = 'John Smith';
$c->save();
$c->name='John Smith';
$c->save()

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


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

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

将业务逻辑放在“ORM”之外的新类中肯定是正确的。对我来说,与其简单地扩展ORM类,不如用一个新的、有价值的对象类来封装它,这样就可以从数据库设计中获得额外的自由度,从而使您可以将该类视为纯粹的业务对象。

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


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

鉴于我对PHP的有限知识,我不确定这是否相关,但如果您试图创建许多业务对象,这可能是一个非常耗时的过程。也许你应该考虑框架之类的框架。如果您仍在创建业务逻辑,这很好。

我同意这里的其他答案-将其他方法放入子类中。不过,我还要在上面加上一个星号:每次使用额外的方法扩展类时,请考虑您试图通过扩展实现什么,并考虑是否可以将其泛化并返回到父类中。例如:

// 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
类不应扩展
数据库
。组合同样最适合这个用例。

我在我的工作中就这样解决了它。一定要检查一下,然后抓到一些我已经做过的脑力劳动: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功能都从轮询对象中抽象出来。不需要知道。只需使用setupdatabase连接字段/映射。和addRelationship来将关系连接到其他dbobject


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

在继承方面,您的思路肯定是正确的


如果你只是为了构建一个ORM(或者因为你不喜欢别人处理事情的方式)而构建一个ORM,那么你可以考虑一个预构建的ORM,它可以直接从数据库模式生成大部分代码。这会为你节省很多时间。是我目前最喜欢的。还有另一个ORM吗?这也是开源的吗?我很好奇!删除标题和标记中的“PHP”可能是一个好主意,因为这是一个关于OOP的非常普遍的问题,对PHP来说并不是什么特别的问题。添加了“语言不可知论”,因为尽管这个问题引用了PHP,但更多的是一个OOP问题。组合是一个巨大的否定,在OO-design中没有。关于为什么这比继承更好,你有更多的信息吗?继承是一种“是”关系,而组合是一种“有”关系。因此,说“ORM是数据库连接”是错误的。相反,应该说明“ORM有一个数据库连接”。上面的例子概述了DAO模式,它通常比活动记录更健壮。它还将业务逻辑与持久性逻辑分开。