多个扩展类调用特定子

时间:2018-03-02 17:10:59

标签: php oop inheritance

我已经尝试过一些不同的依赖关系,继承和范围。我没办法做到这一点,我只是在尝试,所以我想回答我面临的实际问题,或者知道我是否想要不可能。我不想就如何构建标准MVC提出建议。这个实验的目的是找出是否真的没有更好的方法来做非常具体的事情。

必要的信息

我有8'核心'我基本上希望在任何地方,甚至在彼此之间(如兄弟姐妹)都可以使用的课程。这可能会产生循环依赖,这绝不是我们想要的。

问题在于我希望所有这些类都作为"核心"聚集在一起,这意味着我希望所有这些类共享一个对象并相互修改情境(有点像单例模式, 我猜?)。 然后在MVC本身内,这些类将扩展这个核心,并且这些将被依赖注入,例如任何其他MVC。

核心很小。它只是有一些非常基本的功能,比如加载类,能够设置一些东西到$this,编译模板等等。

所以,我一直在思考这条小小的思路,如果我在一条"火车"类型方式,并只调用最后一个扩展名,以便我将它们全部放在1个单例中?这看起来像这样:

class base{
//The base
}

class model extends base{
 //The 1st child
 public function load($modelName){
   //Code to load a model
 }
}

class controller extends model{
 //2nd child
  public function load($controllerName){
    //code to load controller
  }
}

很好,我在一个实例中拥有一切!

嗯,不完全是我喜欢它的方式!

这带来了一个大问题:呼叫任何"重复"像load()这样的函数会导致最后一个函数默认运行。

$this->load('mymodel');
//Returns: controller "mymodel" not found

我想如何称呼它如下;

$core->model->load('mymodel');
//Executes the childclass Model's "load" method
$core->controller->load('mycontroller');
//Executes the controller class's load method.

真正的问题:

我可以实现吗?如果是这样,怎么做?

我在考虑这样的事情:

1)在基地构建

2)获取所有子类

3)通过$ this-> {$ className} = $ classObj;

将子类放在变量中

4)调用$ this-> classname->方法样式。

但我无法想出任何实现这一目标的方法。谷歌搜索它只会导致人们询问扩展多个父母......

2 个答案:

答案 0 :(得分:0)

好的,我知道这只是一个实验 - 所以让我解释为什么不是你想要走的道路。

如果您有三个与继承链接在一起的类:

  • A类 - 具有方法Load()和成员X,Y和Z
  • B类 - 继承自A类,具有方法Load()和Unload(),以及 会员X
  • C类 - 继承自B类,有成员W和X。

好的,你宣布一个C的实例......你得到了什么?

你得到的东西有:

  • Load() - 在C类中声明的版本(因为你覆盖了 在A和B)
  • 卸载() - 在B类中声明的那个
  • 在C类中声明的成员W和X
  • 在A组宣布成员Y和Z

...此时,您丢失了两个X成员和两个Load()方法。他们被孩子们所覆盖。

“那很好 - 我只是确保我不会在课堂上为我的方法和成员命名。问题解决了!”

暂且不说这一切基本上只是构建一个包含所有东西的“超类”(这是可怕的设计 - 请不要这样做),但它将是一个维护噩梦。突然之间,您无法在任何类中添加任何新方法和成员,而无需检查所有其余以查看该方法或成员是否正在使用 - 因为如果它是,其中一个将覆盖另一个。

Teresko有点粗鲁,但这是有充分理由的:你 滥用继承,而你正在这样做来创建一个非常糟糕的结构。在尝试走这条路之前,你应该先了解OOP原则。

答案 1 :(得分:0)

好的,所以我自己已经弄清楚了,因为没有人愿意提供帮助。

class core {

    //This works to get all classes together
    public function __construct($isLoad = false, $calledClass = 'routing') {
        if( !$isLoad ) {
            global $coreClasses,;
            foreach( $coreClasses as $c => $o ) {
                if( $calledClass != $c ) {
                    $this->{$c} = $o;
                }
            }
        }
    }
        public function loadCore() {
            global $coreClasses;
            global $coreDependencies;
            // require_once BASE . 'base.php';
            foreach( $coreClasses as $class => $object ) {
                $classFile = "$class.php";
                $className = "$class";
                if( !class_exists($className) ) {
                    require_once BASE . $classFile;
                    $coreClasses[$class] = new $className();
                }
                $this->{$class} = $coreClasses[$class];
            }

            foreach( $coreDependencies as $className => $aDependency ) {
                foreach( $aDependency as $sDependency ) {
                    $coreClasses[$className]->{$sDependency} = $coreClasses[$sDependency];
                }
            }
        }
}

以上有点完成它。 MVC的核心控制器类现在扩展了core类,它将包括$this范围内所有必需的核心类。控制器又扩展了控制器类。

有趣的是,我首先去了依赖注入...然后我很快就注意到依赖注入对我来说执行速度比仅仅重新使用相同的类实例要慢。

我认为这是因为没有重新启动类并且轻松添加它们实际上比执行实际注入依赖项所需的5-10个操作更快。

我不是在开玩笑,到目前为止,在我的所有测试中,这种方法似乎要快得多。

注意 现在,我仍然选择依赖注入,因为它更加严格,并且不那么“随意乱搞”......正如人们已经明确表示的那样,标准是有原因的。我觉得应该注意到它。

我仍然有点不高兴,试验和尝试不同的做事方式显然是不允许的。