多个扩展类调用特定的子类

问题描述 投票:-2回答:2

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

必要的信息

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

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

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

所以,我一直在思考这一小小的想法,如果我以“火车”式的方式扩展说8,并且只调用最后一个扩展,那么我将它们全部放在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->方法样式。

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

php oop inheritance
2个回答
0
投票

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

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

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

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

你得到的东西有:

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

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

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

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

特雷斯科有点粗鲁,但这是有充分理由的:你滥用继承权,而你正在这样做,以创造一个可怕的结构。在尝试走这条路之前,你应该先了解OOP原则。


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个操作更快。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.