为了账号安全,请及时绑定邮箱和手机立即绑定

没搞懂呀,求解

    public function __call($name, $args) {

    if ($name == 'speedDown') {

        $this->speed -= 10;

    }

}


$name, $args  这两个值是做什么用的,   还有  都知道函数不存在了  为什么还调用呀


正在回答

4 回答

首先要理解函数的重载,就是同一个函数名,传递不同参数,来实现不同的方法内容。

但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的参数不同,调用了类中的两个私有方法,从而实现了函数的重载。

3 回复 有任何疑惑可以回复我~
#1

站在代码的肩膀上 提问者

非常感谢!
2016-10-24 回复 有任何疑惑可以回复我~

感谢呀~ 我丢

0 回复 有任何疑惑可以回复我~

不应该这么理解,php中的重载和java中的重载不是一个概念,在php中,重载应该就是动态创建和赋值

0 回复 有任何疑惑可以回复我~

回答得非常好,同感谢!!!


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
PHP进阶篇
  • 参与学习       181728    人
  • 解答问题       2575    个

轻松学习PHP中级课程,进行全面了解,用PHP快速开发网站程序

进入课程

没搞懂呀,求解

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信