PHP伪造了多重继承 - 在扩展类中提供假父类中设置的对象属性

时间:2010-11-10 10:57:57

标签: php parameters multiple-inheritance

我使用Can I extend a class using more than 1 class in PHP?

中给出的伪造多重继承

请注意,A类实际上扩展了B类,并且完成了从C类扩展的伪造。

它工作正常,直到我需要在类C的函数中设置的属性才能在类A中可用。考虑该代码的一个小编辑版本,其中我从类A的函数内部调用类C的函数: -

//Class A
class A extends B
{
  private $c;

  public function __construct()
  {
    $this->c = new C;
  }

  // fake "extends C" using magic function
  public function __call($method, $args)
  {
    return call_user_func_array(array($this->c, $method), $args);
  }

//calling a function of class C from inside a function of class A
  public function method_from_a($s) {
     $this->method_from_c($s);
     echo $this->param; //Does not work
  }

//calling a function of class B from inside a function of class A
  public function another_method_from_a($s) {
     $this->method_from_b($s);
     echo $this->another_param; //Works
  }
}

//Class C

class C {
    public function method_from_c($s) {
        $this->param = "test";
    }
}

//Class B
class B {
    public function method_from_b($s) {
        $this->another_param = "test";
    }
}


$a = new A;
$a->method_from_a("def");
$a->another_method_from_a("def");

因此,在C类函数中设置的属性之后在A类中不可用,但如果在B类中设置,则在A类中可用。我缺少什么调整以便在假设置中设置属性父母班的工作真实吗?假冒父母的函数中设置的属性应该在层次结构的所有类中都可用,就像在正常情况下一样。

由于

解决
我在A类中添加了魔术函数__get()并且它有效。

public function __get($name)
{   
   return $this->c->$name;
}

1 个答案:

答案 0 :(得分:2)

这将永远不会起作用,因为'param'不是A的属性:它在c中,这是A的属性。

您需要做的是定义magic methods,例如__set和__get,它们与属性并行__call。