如何在 PHP child 类 中访问修改后的 parent 变量

How do I access a modified parent variable within child classes in PHP

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

在下面的例子中,我基本上简化了我想做的事情。我需要能够从 child classes 访问变量 '$variable'。然而,$variable在构造classA时发生了变化,但是对classB和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->variable 到 return 所有扩展 class 栏。经过研究,最推荐的解决方案是对child的[=中的每个class调用__construct方法33=],但这在这种情况下不起作用,因为 child classes 是从 parent class.

有人可以帮忙吗?谢谢:)

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

也许这样就是答案?

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();

有两个函数调用很麻烦。也许不同的设计模式是可行的方法?

正如@theoemms 指出的那样,除非您使用 parent::__construct() 显式调用它,否则不会调用父构造函数。另一种解决方法是使用 get_called_class() 检查哪个 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();

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