php func get arg,php利用func_get_arg,func_get_args,func_num_args实现伪重载

偶尔在网上看到关于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 却可以直接解决相关问题。具体举个示例代码如下:

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

test(1);

echo ('
');

test(1, 2);

echo ('
');

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 ;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值