2012-02-24 7 views
0

私はその非常に単純な質問だとは思いますが、わかりません。PHP __set変数__getは参照渡しです

私はクラスを持っています。しかし、なぜ「コード」ブロックはとにかく、地獄のように迷惑です

<?PHP 
class PropertyTest { 
    private $data = array(); 

    public function __set($name, $value) { 
     $this->data[$name] = $value; 
    } 

    public function __get($name) { 
     if (array_key_exists($name, $this->data)) { 
      return $this->data[$name]; 
     } 

     $trace = debug_backtrace(); 
     trigger_error(
      'Undefined property via __get(): ' . $name . 
       ' in ' . $trace[0]['file'] . 
       ' on line ' . $trace[0]['line'], 
      E_USER_NOTICE); 
     return null; 
    } 

    public function __isset($name) { 
     echo "Is '$name' set?\n"; 
     return isset($this->data[$name]); 
    } 

    public function __unset($name) { 
     echo "Unsetting '$name'\n"; 
     unset($this->data[$name]); 
    } 

    public function getHidden() { 
     return $this->hidden; 
    } 
} 
?> 

わかりません。

基本的な魔法は本当にセットになります。私は、参照によって渡す__getを変更した場合でも、私はもうこれを行うカント:私はそれが存在するかどうかをチェックするために想定したがが、それは参照することによって何かを返すことがあるので、それが失敗する理由

$object->$variableName = $variableValue; 

が、私はわからないんだけどもしそれが存在しなければ、そうすることはまずありません。 set関数はおそらく呼び出されません。たとえ偽の値を返しても、set関数を呼び出すことはありません。なぜなら、それは既に存在しているか、値を持っているからです。

これを正しく理解していますか?もしそうなら、回避策はありますか?どのように動作し、回避策がありますか?

+0

参照渡しに変更しようとしている部分を具体的に表示できますか?引数をこのように設定すると致命的になってしまいます** PHP致命的なエラー:メソッドPropertyTest :: __ get()は参照で引数を取ることができません** – quickshiftin

+0

public function&__ get($ name){ – John

答えて

0

私はそれが私のために

<?php 
class PropertyTest 
{ 

    private $data = array(); 

    public function __set($name, $value) 
    { 
     $this->data[$name] = $value; 
    } 

    public function &__get($name) 
    { 
     if(array_key_exists($name, $this->data)) 
      return $this->data[$name]; 
     return null; 
    } 

    public function __isset($name) 
    { 
     return isset($this->data[$name]); 
    } 

    public function __unset($name) 
    { 
     unset($this->data[$name]); 
    } 

    public function getHidden() 
    { 
     return $this->hidden; 
    } 
} 

$oPropTest = new PropertyTest(); 
$sField = 'my-field'; 

$oPropTest->$sField = 5; 

var_dump($oPropTest); 

出力罰金働いて何か欠けている場合を除き:私はあなたの__get実装のためにお勧めしたい

bash-3.2$ php test-get-set.php 
object(PropertyTest)#1 (1) { 
    ["data":"PropertyTest":private]=> 
    array(1) { 
    ["my-field"]=> 
    int(5) 
    } 
} 

一つの微調整ではなく__isset方法を活用することです小切手を再実装するよりも(あなたと同じように2つの異なる方法で)

public function __get($name) 
{ 
    if($this->__isset($name)) 
     return $this->data[$name]; 
    return null; 
} 

__getからの返品の考え方については、プライベート属性とプロテクト属性はクラススコープ外の参照によって直接設定できないため、パブリック属性以外のものでは機能しません。

関連する問題