PHP是否具有C#、JAVA、C++等函数重载功能


Does PHP have function overloading feature like C#, JAVA, C++

在我的PHP编程生涯中,每当我在PHP中创建具有相同名称但参数不同的函数时,都会导致错误。正因为如此,我想知道PHP是否有任何类型的函数重载功能,如果有,我很乐意给我举一个例子。

谢谢。

简单地说:不。在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);