Magic method:__set() 和 __get()

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个方法,可以做一些约束,或数据做一些校验之类的事情。否则就太随意了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值