Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 类结构可能需要实现组合以模拟多重继承_Php_Oop_Design Patterns_Multiple Inheritance - Fatal编程技术网

Php 类结构可能需要实现组合以模拟多重继承

Php 类结构可能需要实现组合以模拟多重继承,php,oop,design-patterns,multiple-inheritance,Php,Oop,Design Patterns,Multiple Inheritance,这是基本前提,我正在为db对象使用活动记录模式,我想我需要一些指导如何组织这些类。以及我如何可能划分我的班级结构。希望我不会解释得太过分。如果组合模式是一条路要走,我可能需要一点点的手来实现它 假设在图腾柱的底部有一个ActiveRecord基类,它处理对象到db和db到对象的映射 ActiveRecord的子类是一种通用的User类,处理用户会话、登录、保存时密码字段的加密等 ActiveRecord的另一个子类是ActiveRecord,但稍微高级一些。通常这个类与用户无关,但我的问题是 我

这是基本前提,我正在为db对象使用活动记录模式,我想我需要一些指导如何组织这些类。以及我如何可能划分我的班级结构。希望我不会解释得太过分。如果组合模式是一条路要走,我可能需要一点点的手来实现它

假设在图腾柱的底部有一个
ActiveRecord
基类,它处理对象到db和db到对象的映射

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

ActiveRecord
的另一个子类是
ActiveRecord,但稍微高级一些。通常这个类与
用户
无关,但我的问题是

我希望有一个子类,它本质上是
User
activerecord的组合,但稍微高级一点
<代码>用户,但稍微更高级
,而不必从
用户
复制粘贴所有方法。对于
User
来说,扩展
ActiveRecord而稍微高级一点是没有意义的,因为它需要从本质上重写一系列对
用户有不良行为的方法。
对
用户来说,扩展
ActiveRecord但稍微高级一点
是有意义的,但我必须从
用户
复制并粘贴一系列方法

我知道有些人用图片思考得更好,所以下面是图示的结构

基地

孩子

class User extends ActiveRecord
{
    ....
}
也是孩子

class ActiveRecordButSlightlyMoreAdvanced extends ActiveRecord
{
    ....
}
问题

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

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

我猜你的意思是:

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

如果是这样的话,研究一下你可能会尝试使用的策略模式。在这种情况下,您将创建您的类:

class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
{
    private $_strategy;

    public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) {
        $this->_strategy = $s;
    }
}
让你的策略课:

interface ActiveRecordButSlightlyMoreAdvancedStrategy
{
        // Define what this should do here
}
创建一个实现上述接口的strategy类

class ActiveRecordButSlightlyMoreAdvanced implements ActiveRecordButSlightlyMoreAdvancedStrategry {
    // Do stuff here
}
现在,当您调用这些高级方法时,两个类实现相同的接口,但UserButlyMoreAdvanced类只是将请求传递给strategy对象:

class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
    {
        private $_strategy;

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

        public function someSlightlyMoreAdvancedFunction () {
             return $this->_strategy->someSlightlyMoreAdvancedFunction():
        }
    }
希望这能有所帮助。

你说得对>
class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy
    {
        private $_strategy;

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

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