Bug #62464 [Opn]: implementing two interfaces with same signature no longer gives a fatal error
| From: | j dot henge-ernst at interexa dot de | Date: | Mon, 02 Jul 2012 22:11:55 +0000 |
| Subject: | Bug #62464 [Opn]: implementing two interfaces with same signature no longer gives a fatal error | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-171702@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=62464&edit=1
ID: 62464
User updated by: j dot henge-ernst at interexa dot de
Reported by: j dot henge-ernst at interexa dot de
Summary: implementing two interfaces with same signature no
longer gives a fatal error
Status: Open
Type: Bug
Package: Scripting Engine problem
Operating System: linux
PHP Version: 5.3Git-2012-07-02 (Git)
Block user comment: N
Private report: N
New Comment:
Your example is ok and should work correctly as both interfaces extend the same base interface and
add different methods. In my given example AInterface and BInterface do not extend from a common
interface. So the class which implements RewindableIterator, ReversableIterator must implement
from Iterator:
function current();
function key();
function next();
function valid();
from RewindableIterator:
function rewind();
from ReversableIterator:
function prev();
So lets change my example to:
interface AInterface {
/** @return Aclass[] */
public function getObjects();
}
interface BInterface {
/** @return Bclass[] */
public function getObjects();
}
class CClass implements AInterface, BInterface
{
public function getObjects() {
return ???;
}
}
class AClass {
public function foo() { echo "foo";}
}
class BClass {
public function bar() { echo "bar";}
}
Previous Comments:
------------------------------------------------------------------------
[2012-07-02 17:50:10] nikic@php.net
I'm not sure I see the problem. If the class satisfies both interfaces, why should there be an
error?
E.g., consider:
interface Iterator {
function current();
function key();
function next();
function valid();
}
interface RewindableIterator extends Iterator {
function rewind();
}
interface ReversableIterator extends Iterator {
function prev();
}
class Foo implements RewindableIterator, ReversableIterator {
// ...
}
Why shouldn't the class be able to implement both, as long as the method declarations
don't disagree?
------------------------------------------------------------------------
[2012-07-02 16:11:52] j dot henge-ernst at interexa dot de
Description:
------------
having two different interfaces with same method no longer causes a fatal error like in php 5.3.8.
With fix for bug #43200 (my guess) it is now possible to inherit another interface which has the
same method signature as a previous interface.
implementing an interface with methods which collide with a method name which is already implemented
by another interface should cause an error.
From my point of OOP it does not make sense as the meaning of the colliding interface method do not
express the same, else both interfaces with the same signature part should extend that base
interface.
It's the opposite of bug #46705
Such a change of the language should not be done in a minor release.
Test script:
---------------
<?php
interface AInterface {
public function getLogicalKey();
}
interface BInterface {
public function getLogicalKey();
}
class AClass implements AInterface {
public function getLogicalKey() { return 1; }
}
class BClass extends AClass implements BInterface { }
Expected result:
----------------
Fatal error: Can't inherit abstract function BInterface::getLogicalKey() (previously declared
abstract in AInterface) in x.php on line 12
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=62464&edit=1