如何在 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 可能存在设计缺陷...
从 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 可能存在设计缺陷...