【问题标题】:method overloading in php?php中的方法重载?
【发布时间】:2014-02-09 13:26:30
【问题描述】:

对不起,如果这是一个愚蠢的问题 - 我以前学过一些 java,我知道 PHP 采用了它的一些面向对象的概念,我想知道是否可以以类似的方式重载方法,如下所示:

public function add($number1, $number2){
        return ($number1 + $number2);
    }

    public function add($number1, $number2, $number3){
        return ($number1 + $number2 +$number3);
    }

这在 PHP 中是否可行,或者我是否主要遗漏了一些东西 - 如果事先愚蠢只是试图获得更深入的理解,请道歉。

【问题讨论】:

  • 简单的答案:不,PHP 不支持方法重载(除非你算上__call,尽管这更像是一种解决方法)。

标签: php oop overloading


【解决方案1】:

PHP 不支持方法/函数的重载,但通过func_num_argsfunc_get_arg 支持可变数量的参数

【讨论】:

    【解决方案2】:

    在 PHP 中没有像 java 或 c++ 等其他编程语言中看到的真正的方法重载,但您可以通过这种方式使用可选参数

     public function add($number1, $number2, $number3 = 0){
         return ($number1 + $number2 + $number3);
     }
    

    $number3 是可选的,值为 0

    或者您可以传递一个 array 值或只使用 try func_get_arg()

    function foo()
    {
        $numargs = func_num_args();
        echo "Number of arguments: $numargs<br />\n";
        if ($numargs >= 2) {
            echo "Second argument is: " . func_get_arg(1) . "<br />\n";
        }
        $arg_list = func_get_args();
        for ($i = 0; $i < $numargs; $i++) {
            echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
        }
    }
    

    【讨论】:

      【解决方案3】:

      PHP 没有任何类型的函数签名模式匹配。你能做的最好的就是模仿它:

      class A {
        public function a() {
          $args = func_get_args();
          switch (count($args)) {
            case 0:
              $overload = array($this, '_a0');
              break;
            case 1:
              $overload = array($this, '_a1');
              break;
            default:
              // … etc
          }
          return call_user_func_array($overload, $args);
        }
        protected function _a0() { … }
        protected function _a1($arg) { … }
        // …
      }
      

      但这可能比 IRL 更麻烦。

      【讨论】:

      • 这是方法覆盖,而不是重载(这是操作要求的)
      • @RainFromHeaven 哎呀,你完全正确。重写。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多