来源:自学PHP网 时间:2020-09-21 14:12 作者:小飞侠 阅读:次
[导读] PHP重载基础知识回顾...
今天带来PHP重载基础知识回顾教程详解
重载和重写 先区分一下重载(overload)和重写(override):重载指多个名字相同,但参数不同的函数在同一作用域并存的现象;重写出现在继承中,指子类重定义父类功能的现象,也被称为覆盖。重载中说的参数不同有三种情况:参数个数不同,参数类型不同,参数顺序不同。重写一般指函数的覆盖,即相同签名的成员函数在子类中重新定义(实现抽象函数或接口不是重写),是实现多态(polymorphism)的一种关键技术。成员变量也可以重载/覆盖,但一般不会这么做。 用简单的C代码来说明重载: int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } double add(int a, int b, double c) { return a + b + c; } double add(double a, int b, int c) { return a + b + c; } 第一个函数为参考基准,其他三个对应重载的三种情形。函数重载多见于强类型语言,编译后函数在函数符号表的名称一般是函数名加参数类型。上面的四个函数,g++编译后,nm命令查看符号表中的名字,输出如下:
最后四行的第三列对应编译后四个函数的符号信息,_Z3为前缀,add是函数名,剩下的字母d代表double,i代表int,与生命一一对应。 再回到PHP的重载。PHP的函数声明中参数无需声明类型,直接排除参数类型不同、参数顺序不同两种重载,只剩下参数个数不同一条路可走。定义一个参数个数不同名字相同的函数,这么一个小小的重载要求,在PHP中也是不合法的!原因是PHP中不允许同名函数存在,想定义重名函数,死心吧!虽然大多数情况下以默认参数方式实现重载基本上够用,但不时还会觉得憋屈,忍不住想问一句:PHP为什么不允许(同名函数)重载啊?! PHP的苦衷 PHP不支持同名函数的重载是有原因的。上面已经提到,PHP函数声明时不需要指定参数类型,重载中的三种情况立马废掉两种。幸存的参数个数不同这一条路也走不通,为什么呢?因为PHP中调用函数时,少传参数,不行;多传参数,没问题!来个简单的例子: function foo($arg1, $arg2) { echo "$arg1, $arg2\n"; } // 函数调用 // 参数过少,提示: //PHP Warning: Missing argument 2 for foo() // PHP Notice: Undefined variable: arg2 in php shell code on line 2 foo("tlanyan"); // 参数个数正好,运行正常 foo("hello", "tlanyan"); // 多传参数,运行正常 foo("hello", "tlanyan", "nice day"); // 传更多参数,也一切正常 foo("hello", "tlanyan", "morning", "noon", "afternoon", "evening", "night"); 只要个数不小于声明的,传多少参数PHP不管。所以参数个数不同,在PHP中不足以区分函数。 个人认为另一个不允许名函数存在的重要原因是 PHP5引入了反射API,这是非常强大的类型信息查询工具。就函数声明而言,ReflectionMethod/ReflectionFunction类的getParameters/getNumberOfParameters/getNumberOfRequiredParameters等API,功能上甩 PHP中的重载 只看完上面的内容就说PHP不支持重载,我想随便一个资深的PHP开发都会不由自主的取下拖鞋,然后教你什么是PHP中的重载,并保证至少有好几种实现方法;官方人员对这种认知估计也无力吐槽:能不能好好看官方文档?!官网中可是有一节专门讲重载! 因为种种原因,PHP不支持传统的重载,也就是同名函数的重载,但PHP是支持重载的,而且姿势还不少。简单来说,PHP中主要有以下几种重载方式:
如果你还知道其他方式,欢迎评论给出方案。 总结 PHP的特性决定了其不支持同名函数方式的重载,但并不意味着PHP不支持重载。实际上PHP可以多种方式实现重载,并保持其一贯的简单易用性。 感谢阅读! 以上就是PHP重载基础知识回顾的详细内容,更多关于PHP 重载的资料请关注自学php网其它相关文章! 以上就是关于PHP重载基础知识回顾全部内容,感谢大家支持自学php网。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com