首先,OOP中的重载必须满足两个条件:
①:相同函数名,但函数参数的个数不一样。
②:函数的参数类型也不一样
但对于弱类型的PHP语言来说是没法满足的
你以对函数多添加参数,但对于弱类型的PHP语言来说,只是相当于多传了个临时变量,它不会因为调用函数时参数的个数和定义函数时参数个数不一致而报错或者不调用,
例如:
class Calc {
public function area() {
// 判断一下调用area时,得到的参数个数
$args = func_get_args();
if(count($args) == 1) {
return 3.14*$args[0]*$args[0];
} else if(count($args) == 2) {
return $args[0] * $args[1];
} else {
echo '未知图形';
}
}
}
$calc = new Calc();
// 计算圆的面积
echo $calc->area(10); // 打印:314;
// 再来计算矩形的面积
echo $calc->area(5,8); // 打印:40
从上面的例子来看,PHP确实是不能实现正在的重载的,
但是,我们可以进行伪重载!!!
总结两种方法如下:
方法①:利用函数func_get_args(),func_num_args(),和call_user_func_array(),代码实现如下
class UpLoad {
function olFun() {
$num = func_num_args(); // 获取传过来的参数个数
$args = func_get_args(); // 获取参数的具体内容,得到的是一个数组
$name="olFun".$num; // 后面的尾随数值为参数个数,以方便管理
return call_user_func_array(array($this,$name), $args);
}
function olFun0()
{
echo '一个也没有<br />';
}
function olFun2($a,$b)
{
echo $a.'~'.$b,'<br />';
}
function olFun3($a,$b,$c)
{
echo $a.'~'.$b.'~'.$c,'<br />';
}
}
$up = new UpLoad();
$up->olFun();
$up->olFun(1,2);
$up->olFun(1,2,3);
方法②:利用魔术方法__call($name,$args)进行处理
class UpLoad {
function __call($name, $args)
{
if($name=='olFun')
{
switch(count($args))
{
case 0:
$this->olFun0();
break;
case 1:
$this->olFun1($args[0]);
break;
case 2:
$this->olFun2($args[0], $args[1]);
break;
default:
break;
}
}
}
function olFun0()
{
// do something
}
function olFun1($a)
{
echo $a,'<br />';
}
function olFun2($a, $b)
{
echo $a.'~'.$b;
}
}
$up = new UpLoad();
$up->olFun();
$up->olFun(1);
$up->olFun(1,2);
上面的方法虽然能大体上实现重载,但是还有一些地方还不是完整,比如参数的类型判断,
有时觉得PHP实现重载反而会限制了PHP的灵活性,看需求吧!!