没搞懂呀,求解

来源:2-9 PHP类和对象之重载

站在代码的肩膀上

2016-10-24 20:45

    public function __call($name, $args) {

    if ($name == 'speedDown') {

        $this->speed -= 10;

    }

}


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


写回答 关注

4回答

  • 瓦爾哈拉
    2016-10-24 21:19:16
    已采纳

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

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

    站在代码的肩...

    非常感谢!

    2016-10-24 22:10:20

    共 1 条回复 >

  • 青春猪头少年
    2020-01-26 20:46:05

    感谢呀~ 我丢

  • H_action
    2017-01-17 18:52:20

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

  • H_action
    2017-01-17 18:43:45

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


PHP进阶篇

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

181727 学习 · 2575 问题

查看课程

相似问题