魔术方法的定义
- 就是那些在某些特定的时刻,会自动执行的方法,统称为魔术方法。
- 他们最大的特点是以:
__
双下划线开头。 - 例如构造函数,析构函数,克隆函数,
__get
函数,__set
函数,都是魔术方法。
在PHP中系统自带的函数和方法就有四千多个,记得住吗???
几个在项目中很实用的魔术方法
__call()
,__callStaic()
,__get()
,__set()
,__isset()
,__unset()
__get方法
-
当你调用一个权限上不允许访问的属性时,在类中,
__get
方法就会自动调用,方法接受一个参数,参数值是数命名 -
示例:
class A {
private $a = 10;
protected $b = 20;
public $c = 30;
public function __get($asd){
echo '访问的是' . $asd;
}
}
$haha = new A();
echo $haha->b;//访问的是b
- 作用是,我们可以自己去处理无权访问属性的逻辑,比如a和b属性,当访问之后,无权访问,我们可以在
__get
函数中做一些事;
__set方法
- 当你为一个对象直接增加一个属性例如这样:
$a->xiaoming = 20
,这个属性在对象上不存在,在PHP中是直接在对象上增加这个属性,并赋值,就是:有则重新赋值,没有先增加再赋值 - 增加一个不存在的属性的时候,
__set()
方法会被调用,给你处理对象上不存的属性被增加时的处理权限,你可以在set方法中进行处理,可以抛出错误,说不允许添加,也可以什么都不做,就写一个空方法,则不可添加新属性
class A {
private $a = 10;
protected $b = 20;
public $c = 30;
public function __set($key,$val){
echo '你添加的属性是:',$key,'值为:',$val,',但是不允许被添加';
}
}
$haha = new A();
$haha->d = 20;
var_dump($haha);
//没有写set函数的情况下,新属性被直接添加在了对象上
//写了set函数的情况,set函数接受两个参数,第一个参数是添加的属性的键名,第二个参数是添加的属性的值,一旦写了set函数,则该对象不再被允许添加新的属性;
- 如果是设置已存在的属性,则set函数不会被触发,已存在的属性会被重新赋值
__inset()和__unset()
-
__isset()
__isset
方法在判断(protected/private/不存在)的属性时,就会触发isset方法执行;- isset属性不可信,因为这个函数的返回值可以被自定义,也就是说,无论你判断什么属性,都可以在isset属性中返回true,导致判断属性是否存在都为真;
-
__unset()
- unset方法,在释放一个对象的(protected/private/不存在)的属性时,会被触发
在框架是如何应用的
- 例如,当你在写一个框架的时候,你需要给框架使用者设计一个对象,这个对象允许使用者自行添加属性
- 假如,使用者添加的属性,在你的对象上存在,怎么办?
- 那么你就可以用set方法,将使用者新添加的属性进行梳理,比如将他存在对象中的一个数组中,包括所有的使用者添加的属性,都放在这个数组里,这样就不会和对象自身的属性发生重名,权限不够,覆盖赋值的问题
- 而使用者要读取这个属性,则可以调用get方法,进行处理,判断数组中是否存在,有则返回,无则抛错;
- 其他的魔术方法,请自己举一反三,在框架的设计与开发中,应该如何应用?
__call方法
- 当调用实例对象的(protected/private/不存在)的方法或者实例对象的方法调用其他方法且满足这些条件时,会触发call方法
__callStatic方法
- 当调用实例对象静态的(protected/private/不存在)的方法或实例对象的方法调用自身的静态方法且满足这些条件时时,会触发callStatic方法