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

7 篇文章 0 订阅
4 篇文章 0 订阅

重载:是类的多态的一种实现。函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。这样做的主要好处就是,不用为了对不同的参数类型或参数个数,而写多个函数。
也就是说,我们可以用同一个函数名定义多个同名方法,在我们调用这个函数的时候,就会根据参数列表的个数和参数类型来区分调用。
重载一般在强类型语言中比较常见,例如我在下面用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是弱类型语言

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值