没搞懂呀,求解
public function __call($name, $args) {
if ($name == 'speedDown') {
$this->speed -= 10;
}
}
$name, $args 这两个值是做什么用的, 还有 都知道函数不存在了 为什么还调用呀
public function __call($name, $args) {
if ($name == 'speedDown') {
$this->speed -= 10;
}
}
$name, $args 这两个值是做什么用的, 还有 都知道函数不存在了 为什么还调用呀
2016-10-24
首先要理解函数的重载,就是同一个函数名,传递不同参数,来实现不同的方法内容。
但php里是不能直接实现的,要通过__call方法。
所谓的函数不存在,是指函数没有在类中定义,但你可以在__call方法中定义这个函数的内容,这个函数的名字就是$name承载的值,而$args就是这个函数传递的参数。
<?php class Magic { //__call方法,实例调用Magic类中未被定义的方法时执行 function __call($name,$arguments) { //判断实例调用的是否是foo方法 if($name=='foo') { //如果是整形,则执行私有方法foo_for_int if(is_int($arguments[0])){ $this->foo_for_int($arguments[0]); } //如果是字符串,则调用私有方法foo_for_string if(is_string($arguments[0])){ $this->foo_for_string($arguments[0]); } } } //两个私有方法,实例不能直接调用 private function foo_for_int($x) { print("参数是一个整数!"); } private function foo_for_string($x) { print("参数是一个字符串!"); } } //生成一个实例$x $x = new Magic(); //参数不同,执行的方法也不同 $x->foo(3); $x->foo("3"); ?>
上面是一个__call方法使用的举例,实例$x调用foo方法,类中没有,执行__call方法,__call方法则根据foo的参数不同,调用了类中的两个私有方法,从而实现了函数的重载。
举报