2009-05-22 13 views
1

プライベートメンバー変数へのアクセスを制御するクラスの__get()関数を作成しています。すべてのメンバー価値の読み込みを処理する関数を設計する必要がありますか、または公開されているメンバーのために書くことはできませんか?また、私は、このクラスを継承するクラスは私の__get()関数を使ってプライベートメンバーにアクセスすると仮定しています。オーバーロードされた__getはすべてのメンバ変数を管理する必要がありますか?

class ClassA{ 
    private $collection = array(); 
    public $value; 

    function __get($item){ 
    return $collection[$item]; 
    } 

答えて

1

いいえ、ありません。


class A { 
    public $foo = 'bar'; 
    private $private = array(); 

    public function __get($key) { 
     echo 'Called __get() at line #' ,__LINE__, ' with key {', $key ,'}',"\n"; 
     return $this->private[$key]; 
    } 

    public function __set($key, $val) { 
     $this->private[$key] = $val; 
    } 
} 


$a = new A(); 

var_dump($a->foo); 
$a->bar = 'baz'; 
var_dump($a->bar); 

そして、はい、それはされます:


class B extends A { private $private = array(); } 
$b = new B(); 
var_dump($b->bar); 
0

さて、あなたのコードは、あなたの配列に設定されていないプライベートなアイテムに失敗していました。しかし、やはり、これをあなたの配列の中と外にあるものに対処する方法として使うことができます。上書きすることができ、あなたの呼び出しは、この__get()を使用します継承するが、

function __get($item){ 
    if (isset ($collection[$item])) 
     return $collection[$item]; 
    else { 
     try { 
      return $this->$item ; // Dynamically try public values 
     } catch (Exception $e) { 
      $collection[$item] = 0 ; // Make it exist 
     } 
    } 
    } 

クラスは、明示的にそうするために、親:: __構築物()を使用します。また、静的にすることはできません。 Further reading

+0

これは、__isset()のオーバーロードで処理できます。 –

0

まず、クラス定義内のプロパティ名を検索し、その値を返そうとします。プロパティがない場合 - PHPは__get($ var)を呼び出そうとしますが、ここでは必要なものを返すことができます。これは、Javaのようなゲッタ/セッタを知っている人にとっては、アクセスしたいすべてのクラスメンバのためにそれらを定義する必要がある人にとっては、少し混乱します。

それは、Javaのようなゲッター/セッターを使用するように快適です - あなたはこのような何か書くことがあります。

public function __set($var, $value) 
{ 
    if (method_exists($this, $method = "_set_" . $var)) 
    { 
     call_user_func(array($this, $method), $value); 
    } 
} 
public function __get($var) 
{ 
    if (method_exists($this, $method = "_get_" . $var)) 
    { 
     return call_user_func(array($this, $method), $value); 
    } 
} 

をして、カスタムのゲッター/セッターに

protected function _get_myValue() 
    { 
     return $this->_myValue; 
    } 
protected function _set_myValue($value) 
{ 
    $this->_myValue = $value; 
} 

とのアクセスを定義することで、このコードを使用しますこのようにして定義されたメソッドに変換します:

$obj->myValue = 'Hello world!'; 
関連する問題