PHP函数重载的作用是什么?

PHP函数重载的作用是什么?,php,Php,在Java等语言中,重载可以通过以下方式使用: void test($foo, $bar){} int test($foo){} 然后,如果使用两个参数调用test(),例如test($x,$y),将调用第一个函数。如果您只通过了1个参数,例如test($x),将调用第二个函数 从手册上看,PHP5似乎确实有重载,但它的用途是什么?我似乎无法理解有关此主题的手册。与Java不同。在PHP中,重载意味着您可以通过实现,如\uuuu get,\uu set,\uu call,\uu callSta

在Java等语言中,重载可以通过以下方式使用:

void test($foo, $bar){}
int test($foo){}
然后,如果使用两个参数调用
test()
,例如
test($x,$y),将调用第一个函数。如果您只通过了1个参数,例如
test($x),将调用第二个函数

从手册上看,PHP5似乎确实有重载,但它的用途是什么?我似乎无法理解有关此主题的手册。

与Java不同。在PHP中,重载意味着您可以通过实现,如
\uuuu get
\uu set
\uu call
\uu 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

顺便说一下,PHP从PHP4.3.0开始就支持这种重载。唯一的区别是,在PHP 5之前的版本中,必须使用函数显式激活重载。

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

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

要重载函数,只需在默认情况下将参数传递为null

class ParentClass
{
   function mymethod($arg1 = null, $arg2 = null, $arg3 = null)  
   {  
     if( $arg1 == null && $arg2 == null && $arg3 == null ){ 
        return 'function has got zero parameters <br />';
     }
     else{
       $str = '';
       if( $arg1 != null ) 
        $str .= "arg1 = ".$arg1." <br />";

       if( $arg2 != null ) 
        $str .= "arg2 = ".$arg2." <br />";

       if( $arg3 != null ) 
        $str .= "arg3 = ".$arg3." <br />";

       return $str;
      }
   }
}

// and call it in order given below ...

$obj = new ParentClass;

echo '<br />$obj->mymethod()<br />';
echo $obj->mymethod();

echo '<br />$obj->mymethod(null,"test") <br />';
echo $obj->mymethod(null,'test');

echo '<br /> $obj->mymethod("test","test","test")<br />';
echo $obj->mymethod('test','test','test');
class父类
{
函数mymethod($arg1=null,$arg2=null,$arg3=null)
{  
如果($arg1==null&&$arg2==null&&$arg3==null){
return“函数有零个参数
”; } 否则{ $str=''; 如果($arg1!=null) $str.=“arg1=”.$arg1.“
”; 如果($arg2!=null) $str.=“arg2=”.$arg2.“
”; 如果($arg3!=null) $str.=“arg3=”.$arg3.“
”; 返回$str; } } } //并按下面给出的顺序调用它。。。 $obj=新父类; echo“
$obj->mymethod()
”; echo$obj->mymethod(); echo'
$obj->mymethod(null,“test”)
; echo$obj->mymethod(null,'test'); echo'
$obj->mymethod(“测试”、“测试”、“测试”)
; echo$obj->mymethod('test','test','test');
您给出的示例中,这种类型的重载有什么可能的优点???一个被证明非常有用的场景是当我构建一个货币转换器类时。而不是调用
$converter->convert(2,'EUR','USD')
您实际上可以调用
$converter->convertEurToUsd(2),在我看来,它更具可读性。您可以查看我的源代码:我使用此方法为数据库提供类似LINQ的动态接口。所以我可以做一些事情,比如$db->Select('table')->col_1[$value]->col_2[$value]->Merge('col_1');所以所有的_调用()。传递到正确的处理类(即SQL、File、Xml)。许多PHP ORM库使用uuu Get和uu set方法来完成null所说的工作。谢谢!非常感谢。我主要使用PEAR/Zend框架编码约定。我保持行长度不超过79个字符,方法尽可能短,并且在列中排列变量声明。无论如何,GitHub的语法highlighter也有它的优点:)另请参见。您可以在此链接中使用重载类: