如何在PHP中的子类中访问修改后的父变量

时间:2015-02-14 12:16:29

标签: php class variables dynamic

从php中的扩展类访问动态父变量的最佳方法是什么?

在下面的例子中,我基本上简化了我想要做的事情。我需要能够从子类访问变量'$ variable'。但是,构造类A时, $ variable 会发生变化,但B类和C类的定义不会改变。

 class A {

 protected $variable = 'foo';
  public function __construct(){
    $this->variable = 'bar';
    echo($this->variable);
    $B = new B();                   //Returns 'bar'
  }
 }

 class B extends A {
   public function __construct(){
     echo($this->variable);         //Returns 'foo'
     $C = new C();
   }
 }

 class C extends B {
   public function __construct() {
     echo($this->variable);         //Returns 'foo'
   }
 }

 $A = new A();

我基本上需要 $ this->变量来返回所有扩展类的栏。在研究之后,最推荐的解决方案是回忆孩子的 __ construct 中每个类的 __ construct 方法,但是在这种情况下这不起作用,因为正在调用子类来自父类。

任何人都能伸出援手吗?谢谢:))

2 个答案:

答案 0 :(得分:1)

让子类继承父类的构造函数集变量的唯一方法是调用父类的构造函数。

也许这样的事情就是答案?

class A {
 protected $variable = 'foo';
  public function __construct(){
    $this->variable = 'bar';
    echo($this->variable);
  }
  public function init(){
    $B = new B();
    //Carry on
    $B->init();
  }
 }

 class B extends A {
   public function __construct(){
     parent::__construct();
     echo($this->variable);
   }
   public function init(){
     $C = new C();
     //Carry on
   }
 }

 class C extends B {
   public function __construct() {
     parent::__construct();
     echo($this->variable);
   }
 }

 $A = new A();
 $A->init();

有两个函数调用很麻烦。或许可以采用不同的设计模式?

答案 1 :(得分:1)

正如@theoemms指出的那样,除非你用parent::__construct()明确地调用它,否则不会调用父构造函数。另一种解决方法可能是使用get_called_class()检查实例化哪个类(自PHP 5.3起可用):

class A {

 protected $variable = 'foo';
  public function __construct(){
    $this->variable = 'bar';
    echo($this->variable);
    if (get_called_class() == 'A') {
      $B = new B();                   //Returns 'bar'
    }
  }
 }

 class B extends A {
   public function __construct(){
     parent::__construct();
     echo($this->variable);         //Returns 'bar'
     if (get_called_class() == 'B') {
       $C = new C();
     }
   }
 }

 class C extends B {
   public function __construct() {
     parent::__construct();
     echo($this->variable);         //Returns 'bar'
   }
 }

 $A = new A();

但我想知道,为什么你需要这样做?如果您遇到这种情况,我认为您的课程可能存在设计缺陷......