2

自从我的技术书告诉我,我想知道这是不是真的,例如:

class A {
    public $attr = "hmm";
}

$a = new A();
echo $a->attr; // outputs hmm

好吧,这对我有用,这本书说不是为了在课堂外使用它,它没有创建一个 __get 函数。我有点困惑。

4

3 回答 3

3

这是使用该魔术方法的示例__get

class User {
  private $data = array(
    "name" => "Joe",
    "age"  => "10",
    "phrase" => "Hell Yeah"
  ) ;

  public function __get($name){
    return (isset($this->data[$name)) ? $this->data[$name] : null ;
  }
}

$user = new User() ;

echo $user->age ; //Access the property.

$user->age = 5 ; //Will not be possible, does not exist. But you can define __set

为什么好: 它提供了所谓的read only属性。例如对象mysqli_result有那些东西。( $result->num_rows) 可以像这样轻松访问属性,同时不能重写。您还可以在访问属性时记录任何内容。

为什么不好: 由于检查属性是否存在,如果不存在则调用该方法,从而大大降低了性能。

于 2013-06-22T08:46:32.930 回答
2

public变量和魔法方法都__get()被认为是一种不好的做法。第一个导致对象松散数据封装,而魔术 getter/setter 则吸引复杂性。

在将数据分配给参数之前,通常会对 setter 中的数据执行一些操作。例如,您将验证电子邮件地址。或电话号码的格式。相反,当您使用魔法__get__set方法时,您将不得不在一个方法中完成所有这些操作。

从本质上讲,你的魔法二传手会转入一大堆if .. else不同深度的陈述。

相反,您应该为要操作的实例参数创建一个自定义 getter:

class Book
{
    private $title;
    private $author;

    public function __construct( $author = null, $author = null )
    {
        $this->title = $title;
        $this->author = $author;
    }

    public function setTitle( $title)
    {
        $this->title = $title;
    }

    public function setAuthor( $author)
    {
        $this->author = $author;
    }

}

用作:

$instance = new Book('Jim Butcher');
$isntance->setTitle('Fool Moon');
于 2013-06-22T08:49:19.520 回答
1

__get是一个魔术函数,当您尝试访问不存在的属性时将调用它。首先你需要__get在你的类中定义一个方法

 class foo {

      private $_map = array();

      public function __get($key) {
            if (isset($this->_map[$key])) return $this->_map[$key];
            return null;
      }
 }

如果您执行以下代码并且已经填充$_map,则可以使用它,您可以访问这些值

   $a = new foo();
   $a->bar; //will call __get and pass bar as $key
于 2013-06-22T08:47:33.963 回答