2009-10-02 38 views
19

像Java語言,超載可以以這種方式使用:什麼是PHP函數重載?

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

然後,如果你叫test()以2個參數e.g test($x, $y);,第一個函數將被調用。如果您僅傳遞了一個參數,例如test($x);,則將調用第二個函數。

從手冊看來,PHP 5確實有重載,但它是什麼?我似乎無法理解關於此主題的手冊。

+0

參見[爲什麼PHP不支持函數重載?](http://programmers.stackexchange.com/a/190550/ 84349)。 – 2013-03-18 14:33:35

+0

你可以在這個鏈接中使用可重載的類: http://stackoverflow.com/questions/4697705/php-function-overloading/27231803#27231803 – 2014-12-01 15:55:22

回答

25

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()函數明確激活超載。

+0

這種類型的重載的任何可能的優點,你給的例子是什麼? ?? – 2009-10-02 23:49:08

+8

'__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 – 2009-10-02 23:52:46

+2

我使用這種方法爲我的數據庫動態LINQ類接口。所以我可以做$ db-> Select('table') - > col_1 [$ value] - > col_2 [$ value] - > Merge('col_1');所以所有的__calls()。傳遞給正確的處理類(即SQL,File,Xml)。 – null 2009-10-03 00:24:57

14

如果你想重載像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; 
    } 
} 
-1

要通過加載功能根本就傳遞參數默認爲空,

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');