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

好吧,您的代码将在您的数组中未设置的私人项目上失败。但是话又说回来,您可以使用它来处理数组内外的内容,例如;

  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 回答
0

首先,PHP 在类定义中搜索属性名称并尝试返回其值。如果没有属性 - PHP 会尝试调用 __get($var) ,在这里你可以返回任何你想要的东西。对于那些知道类似 Java 的 getter/setter 的人来说,这有点令人困惑,您必须为要访问的每个类成员定义它们。

当使用类似 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);
    }
}

然后通过定义自定义 getter/setter 来使用此代码

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 回答