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