1

プライベート メンバー変数へのアクセスを制御するクラスの __get() 関数を作成しています。可能なすべてのメンバー値の読み取りを処理する関数を設計する必要がありますか?それとも、パブリックなメンバーに対して関数を記述できないでしょうか? また、このクラスを継承するクラスは、__get() 関数を使用してプライベート メンバーにアクセスすると想定しています。

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

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

3 に答える 3

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);
于 2009-05-22T04:29:08.127 に答える
0

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

Java のような getter/setter を使用するのが快適な場合は、次のように記述できます。

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!';
于 2009-05-22T09:59:49.840 に答える
0

配列に設定されていないプライベート アイテムでは、コードは失敗します。しかし、繰り返しになりますが、これを使用して、配列の内外にあるものを処理することができます。

  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
       }
    }
  }

呼び出しを継承するクラスはこの __get() を使用しますが、オーバーライドできるため、明示的には parent::__construct() を使用してください。また、これらは静的にできないことに注意してください。さらに読む

于 2009-05-22T04:32:34.433 に答える