属性引用不适用于继承

时间:2011-11-12 21:06:20

标签: php inheritance reference

我遇到了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但可能会更新以尝试解决此问题。

2 个答案:

答案 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";

?>