类上的PHP类,获取Parent

时间:2010-12-21 03:45:26

标签: php class

假设我有三节课。一个是父母,两个是“孩子”。但是,我没有使用class - extends -

class root
{
   function root(){
      $this->son = new son();
      $this->daughter = new daughter();
   }
}
class son
{
 ...
}
class daughter
{
  ...
}

如何从 daughter 的函数中调用 son 的函数?换句话说,我如何从 son / daughter 中引用 root 类,以便我可以相互调用彼此的函数?

5 个答案:

答案 0 :(得分:1)

这里唯一可行的方法是将引用显式传递给根类对象:

function root(){
   $this->son = new son($this);
   $this->daughter = new daughter($this);
}

并在sondaughter构造函数中接受它。

class son
{
    private $root;

    public function son($root)
    {
        $this->root = $root;
    }
}

class daughter
{
    private $root;

    public function daughter($root)
    {
        $this->root = $root;
    }

    public function doSomethingToBrother()
    {
        $this->root->son->some_method();
    }
}

答案 1 :(得分:1)

依赖注入的典型案例。

class root {

   function root() {
      $this->son = new son($this);
      $this->daughter = new daughter($this);
   }

}

class son {

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

   function foo() {
       $this->parent->daughter->bar();
   }

}

注意不要在不应该​​拥有它们的类之间创建严格的依赖关系。继承可能是更好的方法。替代方案包括注册表模式和工厂模式。

答案 2 :(得分:0)

由于子和子实际上不是root的子类,因此调用彼此函数的唯一方法是从那里获取实例和调用。除非函数声明为static,否则你可以通过son :: my_func()/ daughter :: my_func等来调用它们。

我不确定目标是什么,但也许这会有所帮助:http://php.net/manual/en/language.oop5.patterns.php

答案 3 :(得分:0)

如果要在它们之间调用方法,则必须将root实例传递给子或子。或者,如果它不依赖于实例,请使用静态方法。

答案 4 :(得分:0)

例如,希望自己说话,重要的是:

a)$this->son = new Son($this); - 其中对Root对象的引用分别传递给新的Son类(或Daughter)。

b)echo $son->root->daughter->aboutme(); - 其中引用用于访问其他对象,root可能有权访问。

可以认为这是一种Mediator pattern

<?php 
    class Root
    {
        function __construct(){
            $this->son = new Son($this);
            $this->daughter = new Daughter($this);
        }
        function aboutme() { print "I'm root.\n"; }

    }
    class Son
    {
        function __construct($root) {
            $this->root = $root;
        }
        function aboutme() { print "I'm a son.\n"; }
    }
    class Daughter
    {
        function __construct($root) {
            $this->root = $root;
        }
        function aboutme() { print "I'm a daughter.\n"; }
    }

    $root = new Root();
    echo $root->aboutme();
    $son = $root->son;
    echo $son->aboutme();
    echo $son->root->daughter->aboutme(); 
?>

这将产生:

I'm root.
I'm a son.
I'm a daughter.