我有一个父类,我将其称为“ ParentClass”,以及一个子类(从其扩展),而我将其称为“ ChildClass”。
ParentClass具有受保护的属性$ prop1和$ prop2,我希望ChildClass访问这些属性。但是我从他们那里得到了NULL。
ParentClass具有__construct()方法,用于设置通过依赖项注入获得的属性。
ParentClass从其方法之一实例化ChildClass。
ChildClass覆盖父构造函数,但在其自己的__construct()方法内部不包含任何代码。
我已经使用var_dump($ this-> prop1)在父类中测试了属性。它返回我期望的值。
但是,如果我从子类中访问var_dump($ this-> prop1),则会得到NULL。
class ParentClass {
protected $prop1;
protected $prop2;
public function __construct($prop1, $prop2) {
$this->prop1 = $prop1;
$this->prop2 = $prop2;
}
public function fakeMethod() {
$child = new ChildClass;
$child->anotherFakeMethod();
// logic
}
}
class ChildClass extends ParentClass {
public function __construct() {
// this overrides the parent constructor
}
public function anotherFakeMethod() {
$prop1 = $this->prop1;
$prop2 = $this->prop2;
var_dump($this->prop1);
// returns NULL
}
}
如果子类从父类继承过来,为什么子类不能访问它的属性?
答案 0 :(得分:1)
它们是可访问的,但它们将是null
,因为它们不会从子对象传递到父构造函数:
(new ChildClass(1,2))->anotherFakeMethod();
输出
NULL
在这种情况下,您的班级会产生null
的预期结果。好吧,它根据编码方式产生了我期望的结果。
要对其进行修复,必须通过子级的构造函数将该数据传递回父类,或者删除子级的构造函数。像这样:
class ChildClass extends ParentClass {
public function __construct($prop1, $prop2) {
parent::__construct($prop1, $prop2);
}
....
}
上述更改之后:
(new ChildClass(1,2))->anotherFakeMethod();
输出
int(1)
这是我期望从此行得到的内容,因为它基本上是构造函数中使用的第一个参数:
var_dump($this->prop1);
如果您知道子类中的内容,也可以用这种方式进行:
public function __construct() {
parent::__construct(1, 2); //say I know what these are for this child
}
您当然可以在新的构造函数中手动设置它们,但在这种情况下,将是WET(两次编写所有内容)或不必要的重复操作。
干杯!