主类可以访问子类方法

时间:2011-01-26 22:37:16

标签: php oop object subclass

如果我有:

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来实现这一点(感谢大家的答案)。我怎么写我的目标,也许你或你认识的人可以建议一种方法来实现这个目标?

我想要一个主要课程。然后我有一组子类,它们像分组函数库一样运行。当需要实现结束时,每个子类都__autoload。例如,我有一个文件上传的子类&处理函数,数据库交互函数的子类,xml处理函数的子类,等等。

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

我希望以这种方式优化加载哪些文件,并保持组织良好。我对oop很新。现在有办法实现这种类型的组织吗?

5 个答案:

答案 0 :(得分:3)

没有这样的语言结构(不管是PHP还是其他语言 - 其他语言提供类似mixins的机制,这类似的工作),但是有一种技术可以做类似的事情,称为控制反转。

class Main {
  public $child;

  public function __construct($child) {
    $this->child = $child;
  }

}

$main = new Main(
  new Child1()
);

$main->child->love();

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

答案 1 :(得分:1)

我认为您感兴趣的是traits,它在当前版本的PHP中不可用,但将在下一版本中,如果您从SVN查看源代码,则可在trunk中使用并自己编译。

有关详细信息,请参阅http://wiki.php.net/rfc/traits

答案 2 :(得分:0)

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

我想如果你真的想,你可以将一个子类对象存储在一个主类对象中并执行类似$main->child->hate();之类的操作,但这会有点递归,因为如果子类扩展了父类,如果孩子被创建并存储在父母的构造中,那么你最终会创建一个创建子元素的父元素的无限循环,从而在其中创建一个新的父元素,从而创建一个新的子元素,无条件地创建一个新的父元素。虽然你可以通过简单地设置一个必须手动调用的方法来创建和存储孩子。

答案 3 :(得分:0)

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

如果child1扩展main,则只能通过从child1类创建实例或在main()类中引入hate()方法来调用hate()方法。 子类继承了Mother类的方法,但事实并非如此。

你究竟想做什么?

答案 4 :(得分:0)

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

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;
    }
  }
}
相关问题