手动实现PHP的方法重载

众所周知,由于弱类型以及特殊的解析方式的原因,PHP本身无法实现方法的重载.但是,通过PHP自带的一些强大的魔术方法,我们可以手动实现方法重载.

class Operation{

	public function __call($name,$args){
		if($name='plus'){
			$args_num=count($args);
			$method_name=$name.$args_num;
			if(method_exists('Operation',$method_name)){
				return call_user_func_array(array($this,$method_name),$args);
			}else{
				die('method doesn`t exist');
			}
		}else{
			die('method doesn`t exist');
		}
	}

	private function plus1($arg1){
		echo '你调用的是plus1<br>';
		return  $arg1;
	}

	private function plus2($arg1,$arg2){
		echo '你调用的是plus2<br>';
		return  $arg1+$arg2;
	}

	private function plus3($arg1,$arg2,$arg3){
		echo '你调用的是plus3<br>';
		return  $arg1+$arg2+$arg3;
	}
}

$op=new Operation();
$value=$op->plus(1,3,1);
echo $value;//'你调用的是plus3<br>'5

其中的核心就是__call()方法和 call_user_func_array()函数.

__call($name,$args)

魔术方法在调用类中一个不存在的方法的时候被自动激活,$name就是这个方法的名字,$args就是传入的参数(数组).

call_user_func_array($callback,$args)

是用来动态调用函数/方法的一个函数.$callback为数组的时候即为调用类中的方法.$args是一个数组,数组中的每一项作为一个参数传入$callback 另外还有一个函数是call_user_func($callback,$args1,$args2…) 功能同上,不同之处在于参数只能一个个单独传入.

Comments

comments powered by Disqus