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 却可以直接解决相关问题。具体举个示例代码如下:

<?phpfunction  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 ; }}

您可能感兴趣的文章

  • php利用session_set_save_handler()函数将session保存到MySQL数据库中
  • PHP 利用 Curl Functions 实现多线程抓取网页和下载文件
  • php利用array_flip实现数组键值交换去除数组重复值
  • 关于使用in_array() foreach array_search() 查找数组是否包含时的性能对比
  • php利用filter函数验证邮箱、url和ip地址的方法
  • 用PHP函数memory_get_usage获取当前PHP内存消耗量以实现程序的性能优化
  • php在数组中查找某个值是否存在(in_array(),array_search(),array_key_exists())
  • PHP中file_get_contents于curl性能效率比较



郑重声明:本文版权包含图片归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们(delete@yzlfxy.com)修改或删除,多谢。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

留言与评论(共有 0 条评论)
昵称:
匿名发表
   
验证码: