2010-01-27 20 views
22

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

+0

你能举个例子吗? – 2010-01-27 14:34:32

+1

你的意思是同名多功能吗? – mck89 2010-01-27 14:35:28

回答

37

其他人有答案很好的代码解释。这是在更高的层面上来讲的解释:Java支持Method overloading这是你指的是当你谈论与同名但不同参数的功能是什么。由于PHP是一种动态类型的语言,这是不可能的。相反,PHP支持Default arguments,您可以使用它来获得相同的效果。

1

不,这是不可能的,因为PHP无法从参数推断你想要的函数(你不指定你期望的类型)。但是,您可以将默认值赋予php中的参数。

这样调用者可以给出不同数量的参数。这将会调用相同的功能。

实施例是:

function test($a = true) 

这给出了默认设置为TRUE,如果给出0参数,并采取主叫值,如果1个给出参数。

7

简答题:不可以。只能有一个具有给定名称的函数。

较长的回答:你可以通过创建一个令人费解的包括系统,包括与观点的权利号码的功能做到这一点。或者,更好的是,您可以利用PHP允许参数的默认值以及可变数量的参数。

要利用默认值只是定义功能,当值分配给一个参数:

function do_something($param1, $param2, $param3 = 'defaultvaule') {} 

这是普遍的做法是使用默认值参数的函数声明的结尾,因为它们可以被省略当函数被调用,使语法使用它们更加清晰:

do_something('value1', 'value2'); // $param3 is 'defaultvaule' by default 

您还可以通过使用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"); 
?> 
5

以下是不可能用PHP

function funcX($a){ 
    echo $a; 
} 
function funcX($a,$b){ 
    echo $a.$b; 
} 

而是做这样

function funcX($a,$b=2){ 
    echo $a.$b; 
} 

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

32

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

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); 
      } 
     } 
    }  
} 

然后,你可以这样做:

$foo = new Foo(); 
$foo->doSomething(1,2); // calls $foo->doSomethingWith2Parameters(1,2) 
$foo->doSomething(1,2,3); // calls $foo->doSomethingWith3Parameters(1,2,3) 

这可能不是最好的例子,但__call可以非常方便的时候。基本上你可以用它来捕获方法不存在的方法调用。

但它不像Java一样简单。

+1

+1,有趣的解决方法;) – 2010-01-27 14:56:38

+0

这很好,因为如果2个参数的预期数据类型不同于3个参数,则不必担心检查类型 – andrewtweber 2014-12-23 19:31:09

2

与其他人一样,默认情况下不支持。 Felix的例子使用__call()可能是最好的方法。否则,如果您使用的是彼此继承的类,则始终可以在您的子类中重载方法名称。这也可以让你调用父方法。

把这些类例如...

class Account { 
    public function load($key,$type) { 
    print("Loading $type Account: $key\n"); 
    } 
} 

class TwitterAccount extends Account { 
    public $type = 'Twitter'; 

    public function load($key) { 
    parent::load($key,$this->type); 
    } 
} 

然后你可以打电话给他们这样的...

$account = new Account(); 
$account->load(123,'Facebook'); 

$twitterAccount = new TwitterAccount(); 
$twitterAccount->load(123); 

而且你的结果会是...

 
Loading Facebook Account: 123 
Loading Twitter Account: 123 
0

重载在PHP中是不可能的,但您可以用其他响应中解释的默认参数值来解决它。

此解决方法的限制是当人们想根据参数类型重载函数/方法时。这在PHP中是不可能的,您需要自己测试参数类型,或者编写几个函数。函数min和max就是一个很好的例子:如果有一个数组类型的参数,它返回数组的最小/最大值,否则返回参数的最小/最大值。

0

我知道这是一个有点老问题,但由于php56您可以:

function sum(...$numbers) { 
    $acc = 0; 
    foreach ($numbers as $n) { 
     $acc += $n; 
    } 
    return $acc; 
} 

echo sum(1, 2, 3, 4); 

裁判:http://php.net/manual/en/functions.arguments.php

0

我有类似的想法:

功能过程($参数1, $ type ='array'){ switch($ type){ case'array': //做点什么 break; case'associative_array': //做点什么吧 break; case'int_array': //用它做点什么 break; case'string': //做点什么吧 break; //等等...... } }