在我的PHP编程生涯中,每当我在PHP中创建具有相同名称但不同参数的函数时,这都会导致错误。因为我很想知道PHP有没有任何类型的功能重载功能,如果它有,我会很感激地向我展示一个例子。
感谢。
答案 0 :(得分:1)
简单地说:不。在PHP中,方法签名不包含它的参数集,只包括它的名称。因此,具有相同名称但参数不同的两种方法实际上被认为是相等的(因此会产生错误)。
PHP确实有一个不同的过程,它称之为方法重载,但它是解决问题的另一种方法。在PHP中,重载是一种在运行时可以在对象上动态创建方法和属性的方法。下面是使用__call
方法的示例。
当没有方法匹配在类内部调用的方法名时,将调用类的__call
方法。它将接收方法名称和参数数组。
class OverloadTest {
public function __call($method, $arguments) {
if ($method == 'overloadedMethodName') {
switch (count($arguments)) {
case 0:
return $this->overloadedMethodNoArguments();
break;
case 1:
return $this->overloadedMethodOneArgument($arguments[0]);
break;
case 2:
return $this->overloadedMethodTwoArguments($arguments[0], $arguments[1]);
break;
}
}
}
protected function overloadedMethodNoArguments() { print "zero"; }
protected function overloadedMethodOneArgument($one) { print "one"; }
protected function overloadedMethodTwoArguments($one, $two) { print "two"; }
}
$test = new OverloadTest();
$test->overloadedMethodName();
$test->overloadedMethodName(1);
$test->overloadedMethodName(1, 2);
或者,您可以提供具有默认参数的函数,这将有效地允许看起来像重载的语法。如:
function testFunction($one, $two = null, $three = null) {
}
testFunction(1);
testFunction(1, 2);
testFunction(1, 2, 3);
最后,至于第三种方法,你当然可以在函数本身内作为数组访问参数
function variableFunction() {
$arguments = func_get_args();
switch (count($arguments)) {
// ...
}
}
variableFunction();
variableFunction(1, 2, 3, 4, 5, 6, 7, 8, 9);