0

这是基本前提,我正在为 db 对象使用活动记录模式,我认为我需要一些指导来组织这些类。而且总的来说,我如何可能拆分我的班级结构。希望我不要解释得太糟糕。如果组合模式是要走的路,我可能需要一点手来实现它。

假设有一个ActiveRecord基类,位于图腾柱的底部,用于处理将对象映射到数据库以及将数据库映射到对象。

的子类ActiveRecord是一种通用User类,它处理用户会话、登录、保存时密码字段的加密等。

另一个孩子ActiveRecord是一个ActiveRecordButSlightlyMoreAdvanced班级。通常这个类与 无关User,但这是我的问题。

我想要一个子类,它本质上是Userand的组合ActiveRecordButSlightlyMoreAdvancedUserButSlightlyMoreAdvanced,而不必从 中复制粘贴所有方法UserUser扩展没有意义ActiveRecordButSlightlyMoreAdvanced,因为它本质上需要重写一堆对User. UserButSlightlyMoreAdvanced扩展是有意义的ActiveRecordButSlightlyMoreAdvanced,但我必须从User.

我知道有些人认为图片更好,所以这里是图示的结构。

根据

class ActiveRecord
{
    ....
}

孩子

class User extends ActiveRecord
{
    ....
}

还有孩子

class ActiveRecordButSlightlyMoreAdvanced extends ActiveRecord
{
    ....
}

问题

class UserButSlightlyMoreAdvanced extends User AND ActiveRecordButSlightlyMoreAdvanced
{
        :( :( :(
}

我已经考虑这个问题大约一个月了,如果其中一个对象实现保存的方式发生变化,我想不出一个不会给对象双重维护带来负担的解决方案。在接下来的几天里,我将尝试一些解决方案,并可能发布我认为在这种情况下最好的解决方案。

4

2 回答 2

1

我的猜测是你的意思是这样说:

class UserButSlightlyMoreAdvanced extends User AND ActiveRecordButSlightlyMoreAdvanced 
{
    :) :) :)
}

如果是这种情况,请查看特征http://php.net/manual/en/language.oop5.traits.php

于 2012-10-11T21:44:50.840 回答
0

您可以尝试使用策略模式。在这种情况下,您将创建您的类:

class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
{
    private $_strategy;

    public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) {
        $this->_strategy = $s;
    }
}

让你的策略课:

interface ActiveRecordButSlightlyMoreAdvancedStrategy
{
        // Define what this should do here
}

制作一个实现上述接口的策略类。

class ActiveRecordButSlightlyMoreAdvanced implements ActiveRecordButSlightlyMoreAdvancedStrategry {
    // Do stuff here
}

现在,当您调用这些高级方法时,两个类都实现了相同的接口,但 UserButSlightlyMoreAdvanced 类只是将请求传递给策略对象:

class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
    {
        private $_strategy;

        public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) {
            $this->_strategy = $s;
        }

        public function someSlightlyMoreAdvancedFunction () {
             return $this->_strategy->someSlightlyMoreAdvancedFunction():
        }
    }

希望有帮助。

于 2012-10-11T21:55:13.320 回答