首先很罪过的声明一下。搞php快一年了。居然还不知道原来php是不支持重载的(面向对象中广义的重载)。真的很罪过啊。。。以前只是知道php是面向对象等等的。但是自己没有具体的试验过。人云亦云啊。接下来就看看是怎么的不支持的。
代码测试:
<?php
class A{
function a(){
echo 'this is a';
}
function a($b){
echo 'this is '.$b;
}
}
$a = new A();
?>
很不幸,在运行这段代码的时候,php就很干脆的甩出了:Fatal error: Cannot redeclare A::a() in ... 这样的错误。说的是不能重复声明方法a(); 虽然有关php的书上都写明php支持重载。不过其实那是覆盖。是子类对父类方法或变量的重写。不能叫做重载。
看看网上的大虾们的讨论吧。
【1】
突然又想到了,这个问题,不要说我为什么老是用别人的标准来衡量它,道理很简单,因为我要用,最近在对zend framework做一次构架改造,遇到了需要覆盖成员和重载的难题,但是很可惜php是不支持的,只能写很多不同名方法,这看起来也不错,但是仔细想想 这样代码的冗余度是极高的,也不利于接口应用。
说道这个问题,就要说说我很早以前发现的php bug,最后的结论php具有执行的不确定性,当它找不到默认构造的时候的时候(也就是写入一个参量不存在的php构造方法),这个时候php依然执行了它的默认无参数构造,而这在程序中会引起很大的问题。这个问题我当时从php的bug report得到的回答这是对的,我是错的,我不知道我对对象的理解是否有问题,我只知道它执行了一个我不期望的方法,但这被认为是对的,原因就是当在没 有重载概念时当然是对的,为什么不对?因为只要参数不违法就能执行,php似乎对参量控制都很松(这种松是我无法忍受的),php最大的问题就是 false是没有值,不是null就是空,这是一个很奇妙的问题,等于在php中机会不会出错的,这也就能解释为什么它不能重载,因为当他发现方法没有时他根本无法判断这到底是不存在还是类没有初始化,因为他们得到的结果都是一样的!而我不知道为什么这么一个愚蠢的问题为什么得不到修正,至少我知道的语言 里没有这样false不知道是啥的语言,php就是这样的。牢骚就不说了,写点难看的具有php特色的代码去。
原址:edwardpro.javaeye.com/blog/198288
php确实有点搞人。如构造函数中存在参数,如
class b{
__construct($a,$b){
}
}
但是实例化的时候,$b = new b(); 这样可以直接通过!且无任何错误。//错误
这里的构造函数如是这样写法 __construct($a,$b){} 则不会被编译通过。且会产生一个致命错误,Parse error: parse error, expecting `T_FUNCTION' ;而如果是 function __construct($a,$b){} 然后实例化$b = new b(); 这里不会产生一个致命错误,而是出现两个Warning: Missing argument 1 for b::__construct() 警告;虽然程序还会继续往下运行,但是这样的程序不规范且参数的非必要性;所以还是避免这样的疏忽。再次谢谢网友jakey9826的指正。
【2】某牛答:
php不支持函数的重载,以后也不会支持
在oop中,函数的重载有两个条件
1、参数的个数不同——php支持参数缺省,无法用参数个数区别
2、参数的类型不同——php是弱类型语言,会根据上下文自动做类型转换
所以,php不可能支持函数的重载
解决方案:
同上面那个类A,做如下修改。
class A{
function a(){
$args = func_num_args(); //获取参数数量
switch($args){
case 0:
echo '没有参数';
break;
case 1:
do something...
break;
...
default:
break;
}
}
}
php其实是提供重载的。不过并非是面向对象中的那个重载意思了。所以 忽忽。。。
php手册中:PHP所提供的"重载"(overloading)是指动态地"创建"类属性和方法。