func_get_arg、func_get_args、func_num_args实现PHP伪重载

今天在看书的时候,发现书上有这么一条:函数重载的替代方法——伪重载

确实,在PHP中没有函数重载这个概念,让很多时候我们无法进行一些处理,甚至有时候不得不在函数后面定义好N个参数在看到了func_get_arg,func_get_args,func_num_args,这三个函数的时候,你们是不是想起了什么?

So,let's try it...

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

 

延伸阅读:

PHP函数call_user_func和call_user_func_array详解

posted @ 2016-07-11 13:51  52php  阅读(283)  评论(0编辑  收藏  举报