継承で属性参照が機能しない

私は理解できないような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

But when I replace the object creation with $c = new B($v); it 出力

1
2
2
2

これまでと同じ出力が期待されます。どうしてこれなの?私はPHP 5.3を使用しますが、これを修正しようとするためにおそらくアップデートします。

0
追加された
ビュー: 1
ああ、もちろん!ヒント@koenありがとう。とにかく、これは私の意見では、エラーメッセージを発行する必要があります。
追加された 著者 str,
ああ、実際には エラーメッセージを出します。私は私の設定をねじ込んだ...
追加された 著者 str,
あなたは 'private'の代わりに 'protected'を使うべきです。
追加された 著者 koen,

2 答え

$ v を使用しますが、クラスBにはコンストラクタがありません。親のコンストラクタを使用して試してみてください:

class B extends A{
   public function __construct($v)
    {
       parent::_construct($v)
    }
}

交換品をお試しください。

0
追加された
BA のコンストラクタを継承します。 koenはすでに私の問題を指摘していました。
追加された 著者 str,

クラスが別の親クラスを継承する場合、親クラスのpublic変数とprotected変数と関数しか使用できません。 これは同じ結果を出力します。

<?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";

?>
0
追加された
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

招待状へのリンク: https://t.me/joinchat/B2gdSlA_dh1-BQtEKA2dfw このグループではPHPについて話します。 パートナー:kotaeta.com