PHP的方法重载的实现
Java与其他的一些高级语言中,都有方法重载的实现机制
例如Java:
public class Main {
public static void main(String[] args) {
Main _main = new Main();
_main.show();
_main.show(20);
_main.show("微梦", 20);
}
public void show(){
System.out.println("没有参数的show方法");
}
public void show( int age) {
System.out.println("你的年龄是:" + age);
}
public void show( String name, int age ) {
System.out.println(name + "的年龄是:" + age );
}
}运行结果:
没有参数的show方法
你的年龄是:20
微梦的年龄是:20
以上代码是Java语言的代码。Java提供了这样的方法重载,根据不同的需要,调用不同参数个数(类型)的方法,就能获得、输出不同的结果。那么PHP怎么实现呢?
由于PHP是弱类型语言,因此函数的输入参数类型无法确定(可以使用类型暗示,但是类型暗示无法用在诸如整型,字符串之类的标量类型上),并且对于一个函数,比如只定义了3个输入参数,PHP却运行调用的时候输入4个或者更多的参数。因此基于这2点,注定了PHP中无法重载函数,(类似Javascript语言),也无法有构造函数的重载。
由于实现函数的重载对提高开发效率很有帮助,如果能象C#或者C++那样,那就非常好了。事实上,PHP的提供了一个魔术方法,mixed __call ( string name, array arguments )。这个方法在php手册中也有提及,根据官方文档,称此方法可以实现函数重载。当调用对象中一个不存在的方法的时候,如果定义了__call()方法,则会调用该方法。
如下代码:
class A
{
function __call ( $name, $arguments )
{
echo "__call调用<br/>";
echo '$name为'.$name."<br/>";
print_r ($arguments);
}
}
(new A)->test("test","argument");
?>
运行的结果就是:
__call调用
$name为test
Array ( [0] => test [1] => argument )
因此只需要利用该魔术方法既可以实现函数重载。
则实现代码如下:
<?php
class t
{
public function __call( $name, $param ){
$name .= count( $param );
$class = new ReflectionMethod( __CLASS__ , $name );
$class->invokeArgs( $this, $param ) ;
// return $this->$name( $param );
}
public function show0(){
echo 'show方法被调用<br>';
}
public function show1( $param ){
echo '你的名字是:', $param , '<br>';
}
public function show2( $param1, $param2 ){
echo $param1, ' ', $param2, '<br>';
}
}
$s = new t();
$s->show();
$s->show('微梦');
$s->show('hello','world');
?>
运行结果如下:
show方法被调用
你的名字是:微梦
hello world
以上实现过程是使用了PHP提供的反射机制里的一些方法去实现的。兴许还有别的实现方法,我暂时没有去思考过,更别提去寻找和尝试了。所以如果看官有什么好的方法或者建议,就请提出来。让小弟也学习一二,不胜感激。