什么是PHP函数重载?

Cli*_*ote 19 php

在像Java这样的语言中,可以通过以下方式使用重载:

void test($foo, $bar){}
int test($foo){}
Run Code Online (Sandbox Code Playgroud)

然后,如果您test()使用2个参数调用,例如test($x, $y);,将调用第一个函数.如果你只传递了一个参数,例如test($x);,将调用第二个函数.

从手册看来,php 5确实有重载,但是它的用途是什么?我似乎无法理解关于这个主题的手册..

Ion*_*tan 26

PHP的重载意义与 Java不同.在PHP中,超载的意思是你能够对象成员在运行时添加,通过实施一些__magic方法,如__get,__set,__call,__callStatic.您使用新成员加载对象.

PHP中的重载提供了动态"创建"属性和方法的方法.这些动态实体通过魔术方法处理,可以在类中为各种动作类型建立.

一个例子:

class Foo
{
    public function __call($method, $args)
    {
        echo "Called method $method";
    }
}

$foo = new Foo;

$foo->bar(); // Called method bar
$foo->baz(); // Called method baz
Run Code Online (Sandbox Code Playgroud)

顺便说一下,PHP支持PHP 4.3.0以来的这种重载.唯一的区别是,在PHP 5之前的版本中,您必须使用该overload()函数显式激活重载.

  • `_call()`被证明非常有用的一种情况是我建立了一个货币转换器类.而不是调用`$ converter-> convert(2,'EUR','USD');`你实际上可以调用`$ converter-> convertEurToUsd(2);`,这在我看来更具可读性.您可以查看我的来源:http://github.com/igstan/php-utils/blob/master/tests/CurrencyConverterTest.php http://github.com/igstan/php-utils/blob/master/ SRC/CurrencyConverter.php (8认同)
  • 我将此方法用于数据库的动态LINQ类接口.所以我可以做$ db-> Select('table') - > col_1 [$ value] - > col_2 [$ value] - > Merge('col_1'); 所以所有的__calls().传递给正确的处理类(即SQL,File,Xml). (2认同)

Gum*_*mbo 15

如果要重载像Java中的函数,请不要指定任何参数,并使用func_num_argsfunc_get_args函数来获取传递给该函数的参数数量或参数本身:

function test() {
    $args = func_get_args();
    switch (count($args)) {
        case 1:
            // one argument passed
            break;
        case 2:
            // two arguments passed
            break;
        default:
            // illegal numer of arguments
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)