我不清楚在PHP 5.4.7中如何实现类继承(几乎是旧的!我知道!)。 考虑以下示例:
$ bash compilewargs.sh compilewargs.sh foo bar baz
error: first argument not a c/c++ file
如果我按顺序打电话
Class ClassA {
public $property = array();
function __construct() {
$this->property[] = "ClassA.construct";
}
public function SetA() {
$this->property[] = "ClassA.Set";
}
}
Class ClassB extends ClassA {
function __construct() {
$this->property[] = "ClassB.construct";
}
function SetB() {
$this->property[] = "ClassB.Set";
}
}
我的预期行为是...
$classA = new ClassA();
$classA->SetA();
$classB = new ClassB();
$classB->SetB();
print_r($classB->property);
...但是我却得到了...
Array
(
[0] => ClassA.construct
[1] => ClassA.Set
[2] => ClassB.construct
[3] => ClassB.Set
)
那么,我这边怎么了? 如何将子元素添加到父对象定义的数组中?
答案 0 :(得分:3)
您通常会误解继承的工作原理:$classA
是ClassA
的一个实例,与您生成的$classB
的实例ClassB
无关。
ClassB
的实例继承了ClassA
的所有公共和受保护的属性和方法,但是只要您不使用它们,就不会看到它们。
所有实例,无论是来自ClassA
还是来自ClassB
的实例,都是彼此无关的,它们只有相同的“模板”,但每个实例都有自己的属性值。
答案 1 :(得分:1)
这很简单:如果您忘记在ClassB
中调用父构造函数,为什么还要运行它呢?根据{{3}}的说法,自PHP 5.0.0起,这没有改变,并且在最新的PHP 7版本中仍然有效
答案 2 :(得分:1)
在PHP中,不会自动调用父级构造函数,因此,您需要执行以下操作:
Class ClassB extends ClassA {
function __construct() {
parent::__construct();
$this->property[] = "ClassB.construct";
}
function SetB() {
$this->property[] = "ClassB.Set";
}
}
而且最多,您会得到这个
Array
(
[0] => ClassA.construct
[2] => ClassB.construct
[3] => ClassB.Set
)
因为从未SetA()
被调用
调用所描述的序列时,$classA
和$classB
是两个不同的实例,因此您将永远无法获得期望的结果。
要获得想要的东西,您需要这样做:
$classB = new ClassB();
$classB->SetB();
$classB->SetA();
print_r($classB->property);
答案 3 :(得分:1)
如果要获得预期的结果,则需要按照PHP oops概念更改代码,但这将无法按您的意愿进行。
您更新了代码
Class ClassA {
public $property = array();
function __construct() {
$this->property[] = "ClassA.construct";
$this->SetA();
}
public function SetA() {
$this->property[] = "ClassA.Set";
}
}
Class ClassB extends ClassA {
function __construct() {
parent::__construct();//invoke parent constructor
$this->property[] = "ClassB.construct";
}
function SetB() {
$this->property[] = "ClassB.Set";
}
}
$classB = new ClassB();
$classB->SetB();
print_r($classB->property);
预期结果:
Array
(
[0] => ClassA.construct
[1] => ClassA.Set
[2] => ClassB.construct
[3] => ClassB.Set
)
调用parent::__construct();
时,它还会为子类维护$property
数组变量。
注意:众所周知,OOPS概念中的每个对象都有不同的实例。