php中func_get_arg,func_get_args,func_num_args实现伪重载
我们知道在PHP中没有函数重载这个概念,让很多时候我们无法进行一些处理,甚至有时候不得不在函数后面定义好N个参数只有使用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 却可以直接解决相关问题,具体举个示例代码如下:
- <?php
- function testOne($a) {
- echo ('一个参数就这样 ');
- }
- function testTwo($a, $b) {
- echo ('两个参数的就这样 ');
- }
- function testThree($a, $b, $c) {
- echo ('呵呵,这是三个参数的 ');
- } //开源软件:phpfensi.com
- 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 ;
- }
- }
- ?>
友情提示:
php的的func_num_args、func_get_arg和func_get_args都是返回函数实参相关的函数.
func_num_args:实参个数;
func_get_arg:返回某一个实参,必须事实参数组的索引;
func_get_args:返回实参数组;