php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Doc Bug #62464 implementing two interfaces with same signature no longer gives a fatal error
Submitted: 2012-07-02 16:11 UTC Modified: 2020-01-27 14:12 UTC
Votes:5
Avg. Score:4.2 ± 0.7
Reproduced:4 of 5 (80.0%)
Same Version:1 (25.0%)
Same OS:0 (0.0%)
From: j dot henge-ernst at interexa dot de Assigned: cmb (profile)
Status: Closed Package: Scripting Engine problem
PHP Version: 5.3Git-2012-07-02 (Git) OS: linux
Private report: No CVE-ID: None
 [2012-07-02 16:11 UTC] 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



Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2012-07-02 17:50 UTC] 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 22:11 UTC] j dot henge-ernst at interexa dot de
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";}
}
 [2012-08-07 22:41 UTC] valderrama dot christopher at gmail dot com
The certification guide states that a object can't implement two interfaces that 
share the same method, but the code still runs ok.

So if classes are going to be allowed two implement two interfaces that share the 
same method, I think that the certification exam should be changed to reflect 
this change.
 [2013-03-22 15:27 UTC] pawel dot ulewicz at gmail dot com
Any news about it?

I think the current behavior is ok(implementing two interfaces with same signatures should be possible), but it should be documented. 

Right now the documentation states clearly: "A class cannot implement two interfaces that share function names, since it would cause ambiguity.", so it looks like an undocumented feature(bug?) with uncertain status. I would use this in my code(and i'm not the only one, check the comments here: bug #33698), but i don't know if it's going to be removed in future versions or not.
 [2015-08-09 13:53 UTC] php at mcq8 dot be
The documentation is updated.
The concern stated in this bugreport is solved in php7 with return type declarations.
An error will be triggered if you implement two interfaces that have the same method name but have a different return type.

For example:
interface AInterface {
    /** @return Aclass[] */
    public function getObjects(): AClass;
}
interface BInterface {
    /** @return Bclass[] */
    public function getObjects(): BClass;
}

class CClass implements AInterface, BInterface
{
    public function getObjects(): AClass {
       return "???";
    }
}
class AClass {
    public function foo() { echo "foo";}
}
class BClass {
    public function bar() { echo "bar";}
}
 [2016-09-22 17:22 UTC] phansys at gmail dot com
The documentation states that for PHP >= 5.3.9, this is the expected behavior: http://php.net/manual/en/language.oop5.interfaces.php
 [2020-01-27 14:12 UTC] cmb@php.net
-Status: Open +Status: Closed -Type: Bug +Type: Documentation Problem -Assigned To: +Assigned To: cmb
 [2020-01-27 14:12 UTC] cmb@php.net
Since the behavior is properly documented, and any change would
require at least discussion on the internals@ mailing list[1] (and
may an RFC), I'm closing this as documentation issue.  

[1] <https://www.php.net/mailing-lists.php>
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Apr 25 23:01:29 2024 UTC