我从Java开始使用OOP,现在我对PHP非常重视。是否有可能用Java中的不同参数创建函数的多个?或者语言的解释/非类型化特性会阻止这种情况并导致冲突吗?
答案 0 :(得分:39)
其他人都有良好的代码解释答案。以下是更高级别的解释:Java支持Method overloading,当您谈论具有相同名称但不同参数的函数时,这是您所指的。由于PHP是动态类型语言,因此无法实现。相反,PHP支持Default arguments,您可以使用它来获得相同的效果。
答案 1 :(得分:37)
如果您正在处理课程,可以使用__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中的不一样或容易。
答案 2 :(得分:8)
简答:不可以。只能有一个具有给定名称的功能。
更长的答案:您可以通过创建一个包含具有正确数量参数的函数的复杂包含系统来实现此目的。或者,更好的是,您可以利用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");
?>
答案 3 :(得分:5)
使用php
无法执行以下操作function funcX($a){
echo $a;
}
function funcX($a,$b){
echo $a.$b;
}
相反,这样做
function funcX($a,$b=2){
echo $a.$b;
}
funcX(1)
将显示12
,func(1,3)
将显示13
答案 4 :(得分:2)
与其他人一样,默认情况下不支持。使用__call()
的Felix示例可能是最好的方法。
否则,如果您使用的是彼此继承的类,则始终可以重载子类中的方法名称。这也允许您调用父方法。
以这些课为例......
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
答案 5 :(得分:1)
不可能这不可能,因为PHP无法从参数推断出您想要的函数(您没有指定您期望的类型)。但是,您可以在php中为参数提供默认值。
这样调用者可以提供不同数量的参数。这将调用相同的功能。
示例是:
function test($a = true)
如果给出0参数,则默认值为true,如果给出1参数,则取默认值。
答案 6 :(得分:1)
我知道它有点老问题,但是自从php56你可以:
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
答案 7 :(得分:0)
在PHP中无法进行重载,但您可以使用默认参数值来扩展它,如其他响应中所述。
此变通办法的限制是当人们想要根据参数类型重载函数/方法时。这在PHP中是不可能的,需要自己测试参数类型,或者编写几个函数。函数min和max就是一个很好的例子:如果有一个数组类型的参数,它返回数组的最小值/最大值,否则返回参数的最小值/最大值。
答案 8 :(得分:0)
我有类似的想法:
函数进程($ param1,$ type ='array'){ 开关($ type){ case'array': //用它做点什么 打破; case'associative_array': //用它做点什么 打破; case'int_array': //用它做点什么 打破; case'string': //用它做点什么 打破; //等等...... } }
答案 9 :(得分:0)
我有2种方法,getArrayWithoutKey
,它们将输出数组的所有条目而不提供任何键值。第二种方法getArrayWithKey
将使用键值从同一数组输出特定条目。这就是为什么我在那里使用方法重载的原因。
class abcClass
{
private $Arr=array('abc'=>'ABC Variable', 'def'=>'Def Variable');
public function setArr($key, $value)
{
$this->Arr[$key]=$value;
}
private function getArrWithKey($key)
{
return $this->Arr[$key];
}
private function getArrWithoutKey()
{
return $this->Arr;
}
//Method Overloading in PHP
public function __call($method, $arguments)
{
if($method=='getArr')
{
if(count($arguments)==0)
{
return $this->getArrWithoutKey();
}
elseif(count($arguments)==1)
{
return $this->getArrWithKey(implode(',' , $arguments));
}
}
}
}
/* Setting and getting values of array-> Arr[] */
$obj->setArr('name', 'Sau');
$obj->setArr('address', 'San Francisco');
$obj->setArr('phone', 7777777777);
echo $obj->getArr('name')."<br>";
print_r( $obj->getArr());
echo "<br>";