__call()魔术方法,主要用于在对一个未定义的成员函数调用时被自动调用。
同时在对于没有控制权限,例如被设置为private 或 protected 的成员函数调用时,也会自动触发该魔术方法:
<?php
class Test {
public function __call($name, $argument) {
echo '调用不存在的方法名是:' . $name . '<br>参数是:';
print_r($argument);
echo '<br>';
}
private function bbb(){}
}
$obj = new Test();
$obj->bbb();
注意,当需要对声明为static静态成员函数做调用监听时,需要使用__callStatic()魔术方法,他们两者的区别是:
1、__call() 当要调用的方法不存在或权限不足时,会自动调用__call() 方法。
2、__callStatic() 当调用的静态方法不存在或权限不足时,会自动调用__callStatic()方法。
在上面的课件内容中,我们不是曾经提到过,PHP的Class实现重载机制实际上有2种实现方式,而其中一种就是依靠call()魔术方法。
在对象中调用一个不可访问的方法时,call()会被自动调用
像上面的案例代码中,$name参数是要调用的方法名称 $argument参数是被调用方法的参数数组。
依赖这2个参数,我们就可以实现class的重载功能:
<?php
class demo{
public function __call($name, $arguments){
if($name == "method"){
switch (count($arguments)) { #获得参数数组个数
case 2:
$this->method2($args[0],$args[1]);
break;
case 3:
$this->method3($args[0],$args[1],$args[2]);
break;
}
}
}
private function method2($var1, $var2){
# code...
}
private function method3($var1, $var2, $var3){
# code...
}
}
# 调用
$obj = new demo();
$obj->method(1, 2);
$obj->method(1, 2, 3);