【问题标题】: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 确实有重载,但它是做什么用的?我似乎无法理解有关此主题的手册..

【问题讨论】:

标签: php


【解决方案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');
    

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 2021-03-20
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多