您的位置:首页 > 编程语言 > PHP开发

关于PHP中类方法的重载问题

2015-11-13 16:19 489 查看
重载:是类的多态的一种实现。函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。这样做的主要好处就是,不用为了对不同的参数类型或参数个数,而写多个函数。

也就是说,我们可以用同一个函数名定义多个同名方法,在我们调用这个函数的时候,就会根据参数列表的个数和参数类型来区分调用。

重载一般在强类型语言中比较常见,例如我在下面用C#来实现类方法的重载:

//先定义一个类,定义三个同名方法
class MyClass
{
public void func(string str)
{
Console.WriteLine("你输入的是一个字符串:{0}",str);
}
public void func(int num)
{
Console.WriteLine("你输入的是一个数字:{0}",num);
}
public void func(int num1,int num2)
{
Console.WriteLine("你输入了两个数字,他们的和是:{0}",num1 + num2);
}
}

//注意到:第一和第二个函数,参数类型不一样;第三个函数跟其他的参数个数不一样

//调用这些同名方法
class Program
{
static void Main(string[] args)
{
MyClass test = new MyClass();
string str = "LSGO实验室";
int num = 10;
int num1 = 20;
int num2 = 30;
test.func(str);
test.func(num);
test.func(num1,num2);
}
}
//输出的结果是:
//你输入的是一个字符串:LSGO实验室
//你输入的是一个数字:10
//你输入的是两个数字,他们的和是:50


由上面的例子就可以看到,test.func()会根据参数的个数及类型自动调用类里面的不同实现。

好,那回到我们的PHP。PHP5之前的版本对面向对象的支持不是太强,不支持重载。在PHP5中__call()实现方法的重载。

可能大家对__call()方法不怎么熟悉,这里我做简单的介绍。

__call()方法是PHP内置的一个魔术方法,当我们调用类实例中不存在的方法时,__call()方法就会被自动调用。一般情况下,当我们调用类中不存在的方法时,就会出现语法错误,为了能够友好的提示,我们可以在我们的类中声明__call()方法

class Test_class{
function test(){
return "这个方法时存在的!!";
}
//第一个参数是调用的方法名,第二个参数是传递给该方法的参数数组
function __call($method,$param){
if($method == "test"){
return "test方法真的不存在!!";
}
}
}

//调用test();
$test = new Test_class();
echo $test->test();
//返回的结果是:“这个方法时存在的!!”,毕竟现在test方法是在类中有声明的
//我把test()的声明注释了
class Test_class{
//function test(){
//  return "这个方法时存在的!!";
//}
//第一个参数是调用的方法名,第二个参数是传递给该方法的参数数组
function __call($method,$param){
if($method == "test"){
return "test方法真的不存在!!";
}
}
}

//调用test();
$test = new Test_class();
echo $test->test();
//返回的结果是:“test方法真的不存在!!”,调用了__call()方法


由以上的例子我们可以看到,__call()的功能是,当我调用类中不存在的方法时被调用,我们可以在__call()方法中做一些比较有好的处理。

好吧,言归正传,在PHP中,我们用__call()来实现方法的重载:

class MyClass(){
//声明__call()方法,实现重载display()方法
public funciton __call($method,$param){
if($method == "display"){
//由于$param是一个数组,我们用$param[0]取得我们传过来的数据
if(is_int($param[0])){
return $this->display_int($param[0]);
}else if(is_array($param[0])){
return $this->display($param);
}else{
return "你传过来的参数不符合要求,该函数需要的是整形数据或数组";
}
}
private function display_int($num){
return "你输入的是一个数字:".$num;
}
private function display_array($arr){
return "你输入的是一个数组,元素分别是:".implode(",",$arr);
//implode()函数将数组转换成字符串
}
}
}

//调用display()
$class = new MyClass();
$num = 100;
$arr = array("LSGO","华硕体感","创新实验室");
echo $class->display($num);
echo $class->display($arr);

//返回的结果是:
//你输入的是一个数字:100
//你输入的是一个数组,元素分别是:LSGO,华硕体感,创新实验室


使用__call()方法,我们成功的实现了类方法的重载,不过,我感觉没有C#类方法重载方便,毕竟PHP是弱类型语言
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: