关于PHP中类方法的重载问题
2015-11-13 16:19
489 查看
重载:是类的多态的一种实现。函数重载指一个标识符被用作多个函数名,且能够通过函数的参数个数或参数类型将这些同名的函数区分开来,调用不发生混淆。这样做的主要好处就是,不用为了对不同的参数类型或参数个数,而写多个函数。
也就是说,我们可以用同一个函数名定义多个同名方法,在我们调用这个函数的时候,就会根据参数列表的个数和参数类型来区分调用。
重载一般在强类型语言中比较常见,例如我在下面用C#来实现类方法的重载:
由上面的例子就可以看到,test.func()会根据参数的个数及类型自动调用类里面的不同实现。
好,那回到我们的PHP。PHP5之前的版本对面向对象的支持不是太强,不支持重载。在PHP5中__call()实现方法的重载。
可能大家对__call()方法不怎么熟悉,这里我做简单的介绍。
__call()方法是PHP内置的一个魔术方法,当我们调用类实例中不存在的方法时,__call()方法就会被自动调用。一般情况下,当我们调用类中不存在的方法时,就会出现语法错误,为了能够友好的提示,我们可以在我们的类中声明__call()方法
由以上的例子我们可以看到,__call()的功能是,当我调用类中不存在的方法时被调用,我们可以在__call()方法中做一些比较有好的处理。
好吧,言归正传,在PHP中,我们用__call()来实现方法的重载:
使用__call()方法,我们成功的实现了类方法的重载,不过,我感觉没有C#类方法重载方便,毕竟PHP是弱类型语言
也就是说,我们可以用同一个函数名定义多个同名方法,在我们调用这个函数的时候,就会根据参数列表的个数和参数类型来区分调用。
重载一般在强类型语言中比较常见,例如我在下面用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是弱类型语言
相关文章推荐
- 写给系统管理员的25个PHP安全实践
- PHP array_splice()与array_slice()函数
- laravel5 路由配置 技巧
- 初写博客--laravel与hybrid 开发的数据传输
- xp下搭建FTP服务器过程中遇到的问题
- laravel 路由无法跟踪的问题
- PHP函数补完:array_multisort()
- PHP一些常用的字符串函数
- PHP7版本改动细节整理翻译完毕
- Zend Studio使用介绍
- 开启PHP Static 关键字之旅模式
- 15个超实用的php正则表达式
- laravel安装
- 超常用的PHP正则表达式收集整理
- PHP 新建动态类的代码
- PHP一些常用的字符串函数
- (PHP)正则表达式-preg_match和preg_match_all()的用法
- php正则表达式学习笔记
- PHP请求页面
- (PHP)正则表达式-preg_replace()和preg_filter()