我遇到了PHP的行为,我似乎无法理解。
class A {
private $v;
public function __construct(&$v)
{
$this->v = &$v;
}
public function setV($v) {
$this->v = $v;
}
public function getV() {
return $this->v;
}
}
class B extends A {
public function setV($v) {
$this->v = $v;
}
}
$v = '1';
$c = new A($v); // <= this will be replaced
echo $c->getV() . "\n";
$v = '2';
echo $c->getV() . "\n";
$c->setV('3');
echo $c->getV() . "\n";
echo $v . "\n";
输出
1
2
3
3
但是当我用$c = new B($v);
替换对象创建时,它会输出
1
2
2
2
我希望输出与以前相同。为什么是这样?我使用PHP 5.3但可能会更新以尝试解决此问题。
答案 0 :(得分:0)
你使用$c = new B($v)
但是B类没有构造函数,那么为什么你传递参数$v
。使用父的构造函数并尝试:
class B extends A{
public function __construct($v)
{
parent::_construct($v)
}
}
然后尝试替换。
答案 1 :(得分:0)
当一个类扩展另一个父类时,它只能使用父类中的公共变量和受保护变量和函数。 所以这将打印相同的结果;
<?php
class A {
private $v;
public function __construct(&$v)
{
$this->v = &$v;
}
public function setV($v) {
$this->v = $v;
}
public function getV() {
return $this->v;
}
}
class B extends A {
public function setV($v) {
parent::setV($v);
}
}
$v = '1';
$c = new B($v); // <= this will be replaced
echo $c->getV() . "\n";
$v = '2';
echo $c->getV() . "\n";
$c->setV('3');
echo $c->getV() . "\n";
echo $v . "\n";
?>