像Java語言,超載可以以這種方式使用:什麼是PHP函數重載?
void test($foo, $bar){}
int test($foo){}
然後,如果你叫test()
以2個參數e.g test($x, $y);
,第一個函數將被調用。如果您僅傳遞了一個參數,例如test($x);
,則將調用第二個函數。
從手冊看來,PHP 5確實有重載,但它是什麼?我似乎無法理解關於此主題的手冊。
像Java語言,超載可以以這種方式使用:什麼是PHP函數重載?
void test($foo, $bar){}
int test($foo){}
然後,如果你叫test()
以2個參數e.g test($x, $y);
,第一個函數將被調用。如果您僅傳遞了一個參數,例如test($x);
,則將調用第二個函數。
從手冊看來,PHP 5確實有重載,但它是什麼?我似乎無法理解關於此主題的手冊。
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()
函數明確激活超載。
這種類型的重載的任何可能的優點,你給的例子是什麼? ?? – 2009-10-02 23:49:08
'__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
我使用這種方法爲我的數據庫動態LINQ類接口。所以我可以做$ db-> Select('table') - > col_1 [$ value] - > col_2 [$ value] - > Merge('col_1');所以所有的__calls()。傳遞給正確的處理類(即SQL,File,Xml)。 – null 2009-10-03 00:24:57
如果你想重載像Java中的功能,不指定任何參數,並使用func_num_args
和func_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;
}
}
要通過加載功能根本就傳遞參數默認爲空,
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不支持函數重載?](http://programmers.stackexchange.com/a/190550/ 84349)。 – 2013-03-18 14:33:35
你可以在這個鏈接中使用可重載的類: http://stackoverflow.com/questions/4697705/php-function-overloading/27231803#27231803 – 2014-12-01 15:55:22