面向对象 - 魔术方法 ¶
作者:KK
发表日期:2017.2.23
就是某些情景下会被自动调用的方法 ¶
前面说的__construct
和__destruct
两个方法就是在实例化和被销毁这两种场景下会被自动调用的方法,也属于魔术方法
其实PHP的类还有其它魔术方法,我这里先讲几个常见的
首先这些魔术方法作用域也都要定义为public
__get
调用不存在的属性时触发 ¶
class Test{
public function __get($name){
//传进来的参数 $name 是一个字符串,这个值就是外面企图获取的属性名称
echo '我没有' . $name . '这个属性啊';
}
}
$test = new Test();
$age = $test->age; // 我没有age这个方法啊
__set
赋值不存在的属性时触发 ¶
class Test{
public function __set($name, $value){
//$name 是外部要设置的属性名称
//$value 是外部要设置的值
echo '我没有' . $name . '这个属性让你赋值为 . $value';
}
}
$test = new Test();
$test->age = 99; // 我没有age这个属性让你赋值为 99
__call
调用不存在的方法时触发 ¶
class Test{
public function __call($name, $params){
echo '我没有' . $name . '这个方法啊,下面是传进来的参数';
print_r($params); //数组,元素分别是 a 1
}
}
$test = new Test();
$test->abc('a', 1); // 我没有abc这个方法啊
__toString
把一个类当字符串用的时候触发 ¶
class Test{
public function __toString(){
return 'abc123';
}
}
$test = new Test();
echo $test; // abc123
$num = substr($test, 3);
echo $num; //123
这里要说明一下,当程序代码要处理一个字符串参数时,如果将类传进去,那么PHP会自动调用__toString
方法,__toString返回一个字符串给外面,外面实际上就是拿着这个字符串进行处理,而不是拿类本身去处理
更多魔术方法 ¶
callStatic、isset、unset、invoke还有__clone这几个比较少见
也是我做程序员五年来所见过有使用的,个别也是我自己有使用过的
而且这里还没列出全部,其它我压根没见过使用……可能还没碰到合适的使用场景