PHP多态的实现问题

来源:百度知道 编辑:UC知道 时间:2024/05/26 23:54:06
//首先创建一个基类
class figure{
var $a;
function draw($x,$y){
echo "横坐标是:$x,纵坐标是$y <br />";
//其他代码
}
}

//另外还派生了另外一个类rectangle类,如下所示。
class rectangle extends figure{
function draw($x,$y,$z){
echo "长方体的长: $x,宽: $y,高: $z <br />";
}
}

//创建rectangle类实例
$b=new rectangle();
$b->draw(100,100,1000);//调用rectangle类重载后的draw函数

结果报错,Fatal error: Declaration of rectangle::draw() must be compatible with that of figure::draw() in F:\AppServ\www\bookPHPlove\OOPdesign\objectOrientProgrammingAdvanced.php on line 174

请问你各位PHP高手怎么回事?PHP不支持函数的重载吗?还是我的代码有问题!

我在本机测试正常,结果是

长方体的长: 100,宽: 100,高: 1000

可能是你的环境问题,我的是WampServer Version 2.0环境

PHP是不支持重载的...但是PHP有参数默认值的..

这个像取了一半C++的特性和一半JAVA的特性

像继承后...其实派生类的函数会覆盖掉基类的函数...无论形参数量是否相同...在PHP6中加入了类型约束..这种情况就不知道了

其实你实现了个覆盖...而X, Y的基类函数不能直接调用了~~

以上代码5.0测试通过..

主要是你的子类方法里出现了跟父类方法不同的参数$z,这样在PHP中是不允许的,你要是改的话可以这样,定义子类方法为: function draw($x,$y,$z=‘’),也就是置$z初始为空,这样就不会报错了。另外,这么书写是很不正规的,一般是先用__construct()先构造方法,初始就直接取值,至于下面的重构函数里面不要再加其他变量,比如:
class rectangle extends figure{
public $z;
function __construct($x,$y,$z){
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
function draw(){
echo "长方体的长:". $this->x."宽:".$this->y.",高:". $this->z."<br />";
}
}

最后类名最好使用头字母大写,这样看起来方便一点,不知道这么说能不能理解。

你的代码我这运行ok

是不是你的版本问题

我的是5.2.9