我們知道在PHP中沒有函數(shù)重載這個(gè)概念,讓很多時(shí)候我們無法進(jìn)行一些處理,甚至有時(shí)候不得不在函數(shù)后面定義好N個(gè)參數(shù)只有使用func_get_arg,func_get_args,func_num_args實(shí)現(xiàn)偽重載了,下面一起來看看吧.
偶爾在網(wǎng)上看到關(guān)于php的偽重載的問題,有點(diǎn)興趣便研究了一下,下面作者將說說php如何利用func_get_arg,func_get_args,func_num_args實(shí)現(xiàn)函數(shù)的偽重載問題.
首先說說方法重載的好處:
實(shí)現(xiàn)方法重載可以不用為了對不同的參數(shù)類型或參數(shù)個(gè)數(shù),而寫多個(gè)函數(shù),多個(gè)函數(shù)用同一個(gè)名字,但參數(shù)表,即參數(shù)的個(gè)數(shù)或(和)數(shù)據(jù)類型可以不同,調(diào)用的時(shí)候,雖然方法名字相同,但根據(jù)參數(shù)表可以自動(dòng)調(diào)用對應(yīng)的函數(shù),如果我們使用reflector去查看微軟寫的.net的基類庫的話,我們可以發(fā)現(xiàn)他使用很多的方法重載,這樣我們在調(diào)用的時(shí)候,就不需要記那么多的方法名稱,而是知道了方法的功能就可以直接的給他傳遞不同的參數(shù),編譯器會(huì)明確的知道我們調(diào)用了哪一個(gè)方法.
但是在PHP中沒有函數(shù)重載這個(gè)概念,讓很多時(shí)候我們無法進(jìn)行一些處理,甚至有時(shí)候不得不在函數(shù)后面定義好N個(gè)參數(shù)來解決相關(guān)問題,而php提供了幾個(gè)函數(shù),比如:func_get_arg,func_get_args,func_num_args 卻可以直接解決相關(guān)問題,具體舉個(gè)示例代碼如下:
- <?php
- function testOne($a) {
- echo ('一個(gè)參數(shù)就這樣 ');
- }
- function testTwo($a, $b) {
- echo ('兩個(gè)參數(shù)的就這樣 ');
- }
- function testThree($a, $b, $c) {
- echo ('呵呵,這是三個(gè)參數(shù)的 ');
- } //開源軟件:Vevb.com
- function test() {
- $argNum = func_num_args();
- // 這一段其實(shí)可以用 $_arg = func_get_args() 來獲得所有的參數(shù),只是要用數(shù)組而已,不方便我下面的表達(dá),呵呵
- 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 (' 這是沒有參數(shù)的情況 ');
- break ;
- }
- }
- /**
- * 例子的實(shí)現(xiàn)
- */
- test();
- echo ('<br>');
- test(1);
- echo ('<br>');
- test(1, 2);
- echo ('<br>');
- test(1, 2, 3);
- // 這些只是在函數(shù)中的運(yùn)用,其實(shí)最主要的還是在類中的運(yùn)用
- // 如果這些用到類里面我就不需要擔(dān)心構(gòu)造函數(shù)是否有幾個(gè)參數(shù)了,不是嗎?
- // 類里面的運(yùn)用只舉一個(gè)簡單的例子
- 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 ;
- }
- }
- ?>
友情提示:
php的的func_num_args、func_get_arg和func_get_args都是返回函數(shù)實(shí)參相關(guān)的函數(shù).
func_num_args:實(shí)參個(gè)數(shù);
func_get_arg:返回某一個(gè)實(shí)參,必須事實(shí)參數(shù)組的索引;
func_get_args:返回實(shí)參數(shù)組;
新聞熱點(diǎn)
疑難解答