PHP中具有多个参数的相同命名函数

Jos*_*h K 23 php function

我从Java开始使用OOP,现在我对PHP非常重视.是否有可能用Java中的不同参数创建函数的多个?或者语言的解释/无类型性质是否会阻止这种情况并导致冲突?

Poi*_*ter 41

其他人都有很好的代码解释答案.以下是更高级别的解释:Java支持方法重载,当您谈论具有相同名称但不同参数的函数时,这是您所指的.由于PHP是动态类型语言,因此无法实现.相反,PHP支持默认参数,您可以使用它来获得相同的效果.


Fel*_*ing 38

如果您正在处理类,可以使用__call()(参见重载)重载方法,例如:

class Foo {
    public function doSomethingWith2Parameters($a, $b) {

    }

    public function doSomethingWith3Parameters($a, $b, $c) {

    }

    public function __call($method, $arguments) {
      if($method == 'doSomething') {
          if(count($arguments) == 2) {
             return call_user_func_array(array($this,'doSomethingWith2Parameters'), $arguments);
          }
          else if(count($arguments) == 3) {
             return call_user_func_array(array($this,'doSomethingWith3Parameters'), $arguments);
          }
      }
   }    
}
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

$foo = new Foo();
$foo->doSomething(1,2); // calls $foo->doSomethingWith2Parameters(1,2)
$foo->doSomething(1,2,3); // calls $foo->doSomethingWith3Parameters(1,2,3)
Run Code Online (Sandbox Code Playgroud)

这可能不是最好的例子,但__call有时可以非常方便.基本上,您可以使用它来捕获不存在此方法的对象的方法调用.

但它与Java中的不同或简单.


Joh*_*nde 9

简答:不可以.只有一个具有给定名称的功能.

更长的答案:您可以通过创建一个包含具有正确数量参数的函数的复杂包含系统来实现此目的.或者,更好的是,您可以利用PHP允许参数的默认值以及可变数量的参数.

要利用默认值,只需在定义函数时为参数赋值:

function do_something($param1, $param2, $param3 = 'defaultvaule') {}
Run Code Online (Sandbox Code Playgroud)

通常的做法是在函数声明的末尾放置带有默认值的参数,因为在调用函数时它们可能会被省略,并使使用它们的语法更加清晰:

do_something('value1', 'value2'); // $param3 is 'defaultvaule' by default
Run Code Online (Sandbox Code Playgroud)

您还可以使用func_num_args()func_get_arg()获取参数来发送可变数量的参数:

<?php
  function dynamic_args() {
      echo "Number of arguments: " . func_num_args() . "<br />";
      for($i = 0 ; $i < func_num_args(); $i++) {
          echo "Argument $i = " . func_get_arg($i) . "<br />";
      }
  }

  dynamic_args("a", "b", "c", "d", "e");
?>
Run Code Online (Sandbox Code Playgroud)


YOU*_*YOU 5

使用php无法实现以下功能

function funcX($a){
    echo $a;
}
function funcX($a,$b){
    echo $a.$b;
}
Run Code Online (Sandbox Code Playgroud)

而是这样做

function funcX($a,$b=2){
    echo $a.$b;
}
Run Code Online (Sandbox Code Playgroud)

funcX(1)将显示12,func(1,3)将显示13

  • 最后一个示例最好使用空字符串,这样如果仅传递单个参数,您将获得更典型的预期结果: function funcX($a, $b=''){ echo $a.$b; } (2认同)