Edit report at https://bugs.php.net/bug.php?id=51826&edit=1
ID: 51826
Comment by: j dot henge-ernst at interexa dot de
Reported by: 1000235409 at smail dot shnu dot edu dot cn
Summary: maybe a wrong oop logic.
Status: Open
Type: Bug
Package: Class/Object related
Operating System: WINDOWS
PHP Version: 5.3SVN-2010-05-14 (SVN)
Block user comment: N
Private report: N
New Comment:
Seems to be fix with PHP 5.3.9
Previous Comments:
------------------------------------------------------------------------
[2010-05-22 16:21:23] 1000235409 at smail dot shnu dot edu dot cn
<?php
abstract class TAbstractParam {
protected $FValue = null;
public abstract function getType(); //getType
public function Dump() {
return "TYPE=" . $this->getType() . " VALUE=" . $this->FValue;
}
}
interface IParam {
public function getType(); //getType again.
}
class TStringParam extends TAbstractParam implements IParam {
public function getType() {return 'VARCHAR'; } //another getType, the fatal
error goes here.
}
see this example, please...
------------------------------------------------------------------------
[2010-05-18 01:35:34] 1000235409 at smail dot shnu dot edu dot cn
there are other non-abstract methods inside the abstract class to provide some
base behaviors for its children claclasses, which i omitted in this example.
and those non-abstract methods may call the abstract methods. and an abstract
class should not be defdefined as an instance cclass for an interface cuz an
non-abstract one should, so why ambiguity?
------------------------------------------------------------------------
[2010-05-17 19:51:45] crrodriguez at opensuse dot org
Expected behaviour, your code causes ambiguity.
------------------------------------------------------------------------
[2010-05-14 17:42:35] 1000235409 at smail dot shnu dot edu dot cn
I have adapted those code(see it below) into delphi(object pascal, on
Delphi2010), however, nothing wrong at all. so i think it should be a wrong oop
logic in php5(5.2 included also, since i've tested then...)
Type
TAbstractParam = Class(TInterfacedObject)
Procedure getType(); Virtual; Abstract;
End;
IParam = Interface
Procedure getType();
End;
TPrimativeParam = Class(TAbstractParam, IParam)
Procedure getType();
End;
//Other code omitted...
------------------------------------------------------------------------
[2010-05-14 17:15:02] 1000235409 at smail dot shnu dot edu dot cn
Description:
------------
A fatal error generates when a class extends from an abstract class and
implements
from an interface both with a same named abstract (all methods defined inside
interfaces are abstract) method inside.
Test script:
---------------
<?php
abstract class TAbstractParam {
public abstract function getType(); //getType
}
interface IParam {
public function getType(); //getType again.
}
class TPrimativeParam extends TAbstractParam implements IParam {
public function getType() {return 'VARCHAR'; } //another getType, the fatal
error goes here.
}
Expected result:
----------------
[just nothing...]
Actual result:
--------------
Fatal error: Can't inherit abstract function IParam::getType() (previously
declared abstract in TAbstractParam) in E:\foo.php on line 10
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=51826&edit=1