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

Php 多个扩展类调用特定的子类,php,oop,inheritance,Php,Oop,Inheritance,我一直在尝试一些不同的依赖、继承和范围划分方法。没有一种方法是一成不变的,我只是在试验,所以我想对我面临的实际问题有一个答案,或者知道我是否想要不可能的东西。我不想得到关于如何构建标准MVC的建议。这个实验的目的是为了找出是否真的没有更好的方法来做非常具体的事情 必要信息 我有大约8个“核心”类,我基本上希望在任何地方都可以使用,甚至在彼此内部(比如兄弟姐妹)。这可能会产生循环依赖,而这绝不是我们想要的 问题是,我希望所有这些类作为“核心”聚集在一起,这意味着我希望所有这些类共享一个对象,并为彼

我一直在尝试一些不同的依赖、继承和范围划分方法。没有一种方法是一成不变的,我只是在试验,所以我想对我面临的实际问题有一个答案,或者知道我是否想要不可能的东西。我不想得到关于如何构建标准MVC的建议。这个实验的目的是为了找出是否真的没有更好的方法来做非常具体的事情

必要信息 我有大约8个“核心”类,我基本上希望在任何地方都可以使用,甚至在彼此内部(比如兄弟姐妹)。这可能会产生循环依赖,而这绝不是我们想要的

问题是,我希望所有这些类作为“核心”聚集在一起,这意味着我希望所有这些类共享一个对象,并为彼此修改情况(我想有点像一个单例模式?)。 然后在MVC内部,这些类将扩展这个核心,这些类将被注入依赖项,就像任何其他MVC一样

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

所以,我一直有这样一个小小的思路,如果我以“火车”式的方式扩展said 8,然后只调用最后一个扩展,这样我就可以在一个实例中实现它们,会怎么样?这看起来像这样:

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.
真正的问题是: 我可以做到这一点吗?如果可以,如何做到

我在想这样的事情:

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
  }
}
1)在基础上施工

2)让所有的孩子上课

3)通过$this->{$className}=$classObj将子类放入变量中

4)调用$this->classname->methodstyle


但我实在想不出任何办法来实现这一点。谷歌搜索它只会导致人们询问延长多个父母的时间……

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

如果有三个类通过继承链接在一起:

  • 类A-具有方法Load()和成员X、Y和Z
  • 类B-继承自类A,具有方法Load()和Unload(),以及 成员X
  • 类C-继承自类B,具有成员W和X
好的,那么你声明了一个C。。。你得到了什么

你得到的东西有:

  • Load()-在类C中声明的版本(因为您重写了 A和B中的数字)
  • Unload()-在类B中声明的
  • C类中声明的成员W和X
  • 在A类中声明的成员Y和Z
。。。此时,您已经丢失了两个X成员和两个Load()方法。他们的孩子凌驾于他们之上

“没关系,我只需要确保我的方法和成员在不同的类中的名称不相同。问题解决了!”

抛开所有这些,基本上只需构建一个包含所有内容的“超级类”(这是一个糟糕的设计-请不要这样做),但这将是一个维护噩梦。突然之间,如果不检查所有其他方法或成员是否正在使用,就无法在任何类中放入任何新方法和成员,因为如果正在使用,其中一个将覆盖另一个


Teresko有点粗暴,但这有一个很好的理由:你滥用继承权,你这样做是为了创造一个糟糕的结构。在尝试走这条路之前,你应该先温习一下OOP原则。

好的,我自己就知道了,因为没有人愿意提供确切的帮助

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

我不是开玩笑,到目前为止,在我所有的测试中,这个方法似乎要快一点

注意 现在,我仍然选择依赖注入,因为这样做更严格,更不容易搞砸。。。正如人们已经明确指出的那样,标准的存在是有原因的。尽管如此,我还是觉得应该注意到这一点


我仍然有点不安,因为实验和尝试不同的做事方式显然是不允许的。

为什么控制器要扩展模型?停止滥用继承。
扩展
关键字,当大声读出时,表示“是专门类型的”。然后开始讲课:也许你应该考虑把所有这些类都注入一个叫做…的班级。大概App@RiggsFolly这就是我现在的设置。但这否定了我能够在彼此之间调用它们的能力。滥用继承也被多次报道。你还没有发现一种新的魔法方法。相反,您试图使用一种糟糕的编程实践,并通过称之为“实验”来为其辩解。停下来。
突然,如果不检查所有其他方法或成员是否正在使用,就无法在任何类中放入任何新方法和成员,这正是我想知道它是否可以解决的问题。谢谢你的回答和信息