PHP5引入了两个Magic方法分别是__set() 和 __get()(注意是两个下划线). 当直接访问非public定义成员属性的时候,这两个方法就会自动的调用(注意:如果是public的成员属性,当访问的时候,则不会调用者两个magic method哦。)。例如下面的代码:
class myClass {
private $_firstField;
protected $_secondField;
public $_thirdField;
function __get($property){
echo 'fetch property :' . $property . ' value:' . $this->$property . '<br/>';
return $this->$property;
}
function __set($property,$value){
echo 'set property ' . $property . ' value is:' . $value . '<br/>';
$this->$property = $value;
}
}
$clasz = new myClass();
//访问私有的成员变量$_firstField,会调用__set
$clasz->_firstField = "Hello , First Field , You're private property";
//访问保护的成员变量$_secondField,会调用__set
$clasz->_secondField = "Hello , Second Field , You're protected property";
//访问共有的成员变量$_thirdField,不会调用__set
$clasz->_thirdField = "Hello , First Field , You're public property";
好了,这样一来问题就来了。PHP5为什么要引入这个特性呢?
一、__set/__get存在的理由
PHP是一种Loosely Typed语言,因此在使用变量之前可以不必声明,对于类的成员属性来说,这个特性一样起作用。例如下面的例子。
class Customer {
public $name;
}
$c = new Customer();
$c->name = "Sunil"; // $name is set because its public
$c->email = "email@domain.com"; //It works perfectly
echo $c->email;
看见了没有,email属性成功的设定到了Customer的实例$c的里面,并且顺利的读出了结果。这和通常的Strict Typed语言是不太一样的。由于这个原因,PHP5就引入了两个Magic Method。
- __get() : 当读取非public的,defined属性时,会调用该方法;
- __set() : 设定非public的,defined属性时,会调用该方法
当需要访问非public defined的属性时,通过这2个方法,可以做一些约束,或数据做一些校验之类的事情。否则就太随意了。