我希望我能够很用很简单的文字,而又很详细地说明白PHP中的魔术方法的特性,这是一件很难的事情,却并非无法办到。当然,目前对我来说,可能确实无法办到。但那并不代表,我不能去尝试。
为什么要使用魔术方法?
如果你不想更改当前软件代码的习惯或者开发方式,比如在代码中使用了大量的:$obj->var之类格式的代码,又如作为框架的建立者,希望业务开发者在自己代码的基础上开发逻辑的时候,能够不学习任何该框架特有的开发模型,仅仅是基于原有代码风格就可以开发应用,那么魔术方法可以帮助你完成心愿。
__get()和__set()
当在代码中调用:$obj->var时,如果在$obj所实例化的类中,不存在public $var属性时,那么,根据被调用的特性,__get()和__set()会被调用。
class a { private $_data = array(); function __set($k, $v){ $this->_data[$k] = $v; } function __set($k, $v){ if(isset($this->_data[$k])){ return $this->_data[$k]; } return null; } } $a = new a(); $a->m = ’123556′; print $a->m;
适用范围
从语法的角度说,并非所有的情况都适用。如果在类中已经存在外部可以访问的:$obj->var,那么就不会调用__set()和__get()。