为什么这段代码没有改变

时间:2018-08-02 00:31:35

标签: php oop

在下面的代码中,我希望real_changechange方法会更改在构造函数中通过引用传递的变量$n

abstract class y {
  private $x;

  function __construct(&$x) {
    $this->x = &$x;
  }

  function real_change() {
    $this->x = 'real change';
  }
}

class x extends y {    
  function change() {
    $this->x = 'changed';
  }
}

$n = 'intact';
$c = new x($n);
$c->change(); 
echo $n.PHP_EOL; // prints "intact"
$c->real_change();
echo $n.PHP_EOL; // prints "real change"

为什么会这样?

如何在抽象类中创建一种方法来修改属性中引用的变量?

非常感谢。

1 个答案:

答案 0 :(得分:2)

在您的抽象类中,$x被标记为私有,因此扩展类不可用。 $this->x实际上只会在$x中创建一个新的公共class x变量。

如果将变量设置为protected,它将允许访问所有扩展类,并允许您正确设置它。

查看更新后的游乐场here

有关here的更多有关PHP文档可见性的信息。