PHP 函数重载有啥用?

Posted

技术标签:

【中文标题】PHP 函数重载有啥用?【英文标题】:What is PHP function overloading for?PHP 函数重载有什么用? 【发布时间】:2010-12-03 11:51:52 【问题描述】:

在像 Java 这样的语言中,可以这样使用重载:

void test($foo, $bar)
int test($foo)

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

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

【问题讨论】:

另见Why PHP doesn't support function overloading?。 您可以在此链接中使用可重载类:***.com/questions/4697705/php-function-overloading/… 【参考方案1】:

PHP's meaning of overloading 与 Java 不同。在 PHP 中,重载意味着您​​可以在运行时添加对象成员,方法是实现 some of the __magic methods,如 __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

顺便说一句,PHP 从 PHP 4.3.0 开始就支持这种重载。唯一的区别是,在 PHP 5 之前的版本中,您必须使用 overload() 函数显式激活重载。

【讨论】:

你给出的例子的那种类型的重载有什么可能的优势??? __call() 被证明非常有用的一个场景是我构建了一个货币转换器类。而不是调用$converter->convert(2, 'EUR', 'USD');,您实际上可以调用$converter->convertEurToUsd(2);,在我看来这更具可读性。你可以看看我的消息来源:github.com/igstan/php-utils/blob/master/tests/…github.com/igstan/php-utils/blob/master/src/… 我将这种方法用于我的数据库的类似 LINQ 的动态接口。所以我可以做类似 $db->Select('table')->col_1[$value]->col_2[$value]->Merge('col_1');所以所有的__calls()。传递给正确的处理类(即 SQL、File、Xml)。 许多 PHP ORM 库使用 __get 和 __set 方法来完成 null 所讨论的事情。 谢谢!非常感谢。我主要使用 PEAR/Zend Framework 编码约定。我保持不超过 79 个字符的行,尽可能短的方法,并在列中排列变量声明。不管怎样,GitHub 的语法高亮也有它的优点:)【参考方案2】:

如果你想像 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;
    

【讨论】:

【参考方案3】:

要重载函数,只需默认传递参数为 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');

【讨论】:

以上是关于PHP 函数重载有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

静态构造函数有啥用?

java中重载有啥用

重载和覆写有啥区别?

重载和重写有啥区别

C++中赋值运算操作符和=重载有啥区别?

PHP 嵌套函数有啥用?