偶爾在網上看到關於php的偽重載的問題,有點興趣便研究了一下。下面作者將說說php如何利用func_get_arg,func_get_args,func_num_args實現函數的偽重載問題。
首先說說方法重載的好處:
實現方法重載可以不用為了對不同的參數類型或參數個數,而寫多個函數。多個函數用同一個名字,但參數表,即參數的個數或(和)數據類型可以不同,調用的時候,雖然方法名字相同,但根據參數表可以自動調用對應的函數。如果我們使用reflector去查看微軟寫的.net的基類庫的話,我們可以發現他使用很多的方法重載,這樣我們在調用的時候,就不需要記那麼多的方法名稱,而是知道了方法的功能就可以直接的給他傳遞不同的參數,編譯器會明確的知道我們調用了哪一個方法。
但是在PHP中沒有函數重載這個概念,讓很多時候我們無法進行一些處理,甚至有時候不得不在函數後面定義好N個參數來解決相關問題,而php提供了幾個函數,比如:func_get_arg,func_get_args,func_num_args 卻可以直接解決相關問題。具體舉個示例代碼如下:
<?php
function testOne($a) {
echo ('一個參數就這樣 ');
}
function testTwo($a, $b) {
echo ('兩個參數的就這樣 ');
}
function testThree($a, $b, $c) {
echo ('呵呵,這是三個參數的 ');
}
function test() {
$argNum = func_num_args();
// 這一段其實可以用 $_arg = func_get_args() 來獲得所有的參數,只是要用數組而已,不方便我下面的表達,呵呵
for ($i = 0; $i < $argNum; $i++) {
$_arg_{$i} = func_get_arg($i);
}
switch ($argNum) {
case 1 :
testOne($_arg_1);
break ;
case 2 :
testTwo($_arg_1, $_arg_2);
break ;
case 3 :
testThree($_arg_1, $_arg_2, $_arg_3);
break ;
default :
echo (' 這是沒有參數的情況 ');
break ;
}
}
/**
* 例子的實現
*/
test();
echo ('<br>');
test(1);
echo ('<br>');
test(1, 2);
echo ('<br>');
test(1, 2, 3);
// 這些只是在函數中的運用,其實最主要的還是在類中的運用
// 如果這些用到類裡面我就不需要擔心構造函數是否有幾個參數了,不是嗎?
// 類裡面的運用只舉一個簡單的例子
class test{
var $a = 0;
var $b = 0;
function test() {
$argNum = func_num_args();
$_arg = func_get_args();
switch ($argNum) {
case 1 :
$this->test1($_arg[0]);
break ;
case 2 :
$this->test2($_arg[0], $_arg[1]);
break;
default :
$this->a = 0;
$this->b = 1;
break;
}
}
function test1($a) {
$this->a = $a;
}
function test2($a, $b) {
$this->a = $a;
$this->b = $b ;
}
}