2011-11-12 15 views
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) { 
     $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を使用しますが、これを修正しようとするためにおそらくアップデートします。

+1

「プライベート」ではなく「保護」を使用してください。 – koen

+0

ああ、もちろん!ヒント@koenありがとう。とにかく、これは私の意見では、エラーメッセージを発行する必要があります。 – str

+0

ああ、実際には*エラーメッセージを出します。私は私の設定をねじ込んだ... – str

答えて

0

クラスが別の親クラスを継承する場合、親クラスの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

ありがとう、コエンはすでにそれを指摘した。 – str

0

$c = new B($v)を使用していますが、クラスBにはコンストラクタがありません。その場合、パラメータ$vを渡すのはなぜですか。親のコンストラクタを使用してみてください:

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

、あなたの交換にしてみてください。

+0

'B'は' A'のコンストラクタを継承しているので、必要ありません。 koenはすでに私の問題を指摘していました。 – str

関連する問題