自从我的技术书告诉我,我想知道这是不是真的,例如:
class A {
public $attr = "hmm";
}
$a = new A();
echo $a->attr; // outputs hmm
好吧,这对我有用,这本书说不是为了在课堂外使用它,它没有创建一个 __get 函数。我有点困惑。
自从我的技术书告诉我,我想知道这是不是真的,例如:
class A {
public $attr = "hmm";
}
$a = new A();
echo $a->attr; // outputs hmm
好吧,这对我有用,这本书说不是为了在课堂外使用它,它没有创建一个 __get 函数。我有点困惑。
这是使用该魔术方法的示例__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
) 可以像这样轻松访问属性,同时不能重写。您还可以在访问属性时记录任何内容。
为什么不好: 由于检查属性是否存在,如果不存在则调用该方法,从而大大降低了性能。
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');
__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