【问题标题】:Can main classes access child class methods主类可以访问子类方法吗
【发布时间】:2011-01-26 22:37:16
【问题描述】:

如果我有:

class main {
   //hello
}

class child1 {
    function love($v) {
    }
}

class child1 {
    function hate($v) {
    }
}

function __autoload($file) {
    include_once($file . '.php');
}

有什么方法可以设置,以便我可以这样做

$main = new main();
$main->hate();
$main->love();

还是这样

  • 将它们作为单独的类,并且
  • 为子类使用自动加载器?

    认为即使子类extend 是主类,我也无法从父类访问子方法。那是对的吗?如果是这样,是否有类似反向extends 的东西将子类属性/方法注入到主类中?


更新 1

好的,看起来 php 没有直接内置的东西来实现这一点(感谢大家的回答)。不如我写下我的目标,也许你或你认识的人可以提出实现这个目标的方法?

我想要一门主课。然后我有一组像分组函数库一样运行的子类。当需要达到目的时,这些子类中的每一个都是__autoloaded。比如我有一个文件上传&处理函数的子类,一个数据库交互函数的子类,一个xml处理函数的子类,等等。

我想这样使用:调用每个脚本顶部的主类$main = new main();。然后,稍后,需要来自子类(尚未加载)的图像处理方法,所以我调用 $main->methodFromChildClass(); 这将导致该子类被自动加载并使用该方法。

我希望通过这种方式来优化加载哪些文件,并使事情井井有条。我对 oop 还很陌生。现在有没有办法实现这种类型的组织?

【问题讨论】:

    标签: php oop object subclass


    【解决方案1】:

    没有这样的语言结构(无论如何在 PHP 中都没有 - 其他语言提供诸如 mixins 之类的机制,类似的工作),但是有一种技术可以做类似的事情,称为控制反转。

    class Main {
      public $child;
    
      public function __construct($child) {
        $this->child = $child;
      }
    
    }
    
    $main = new Main(
      new Child1()
    );
    
    $main->child->love();
    

    这是非常简化的示例,并未显示该技术的全部潜力。有关更多信息,请搜索“控制反转”和“设计模式”

    【讨论】:

      【解决方案2】:

      我想你感兴趣的是叫做traits,它在当前版本的PHP中没有,但会在下一个版本中,如果你从SVN查看源代码并编译,它可以在trunk中使用自己。

      欲了解更多信息,请参阅http://wiki.php.net/rfc/traits

      【讨论】:

        【解决方案3】:

        据我所知,这有点违反了 OO 编程的整个概念。主类应该有主类的所有子类需要使用的方法和属性,然后子类有只有他们需要使用的方法和属性。

        我想如果你真的想要,你可以在主类对象中存储一个子类对象并执行类似$main->child->hate(); 的操作,但这有点递归,因为如果子类扩展了父类,并且如果child 被创建并存储在 parent 的构造中,然后您将结束一个 parent 的无限循环,该循环创建 child,在其中创建一个新的 parent,它创建一个新的 child,该 child 无限地创建一个新的 parent。尽管您可以通过简单地使用必须手动调用才能创建和存储子项的方法来解决此问题。

        【讨论】:

          【解决方案4】:

          使用您提供的代码,它无法正常工作。

          如果 child1 扩展了 main,则只能通过从 child1 类创建实例或在 main() 类中引入 hat() 方法来调用 hat() 方法。 子类从母类继承方法,但反之则不然。

          你到底想做什么?

          【讨论】:

            【解决方案5】:

            您可以使用魔法来模拟这种行为,但“干净”是不同的

            class main {
              public function __call ($name, $args) {
                switch ($name) {
                  case 'hate':
                    $x = new child1;
                    return $x->hate();
                    break;
                  case 'love':
                    $x = new child2;
                    return $x->hate();
                    break;
                }
              }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-12-20
              相关资源
              最近更新 更多