Edit report at https://bugs.php.net/bug.php?id=63816&edit=1

 ID:                 63816
 Updated by:         dmi...@php.net
 Reported by:        kotlyar dot maksim at gmail dot com
 Summary:            implementation child interface and after parent
                     cause fatal error.
-Status:             Assigned
+Status:             Feedback
 Type:               Bug
 Package:            Scripting Engine problem
 Operating System:   linux
 PHP Version:        5.4.7
 Assigned To:        dmitry
 Block user comment: N
 Private report:     N

 New Comment:

I'm not sure if this is a bug. At least the error message is absolutely 
correct. When class "C" implements interface "FirstChildInterface" it also 
implements its parent interface - "RootInterface", and when it tries to 
implement "RootInterface" it sees that it was already implemented before.

The Laruence's patch removes the error message completely, so the following 
buggy code becomes legal.

<?php
interface foo {}
class bar implements foo, foo {}
?>

I would prefer not to do it.


Previous Comments:
------------------------------------------------------------------------
[2013-01-05 05:37:24] larue...@php.net

not sure why such error is threw in zend_compile.c line 2926

we can simply be silence(or warning),  then ignore it.

diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index e395795..9063023 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -2920,11 +2920,7 @@ ZEND_API void 
zend_do_implement_interface(zend_class_entry *ce, zend_class_entry
                        memmove(ce->interfaces + i, ce->interfaces + i + 1, 
sizeof(zend_class_entry*) * (--ce->num_interfaces - i));
                        i--;
                } else if (ce->interfaces[i] == iface) {
-                       if (i < parent_iface_num) {
-                               ignore = 1;
-                       } else {
-                               zend_error(E_COMPILE_ERROR, "Class %s cannot 
implement previously implemented interface %s", ce->name, iface->name);
-                       }
+                       ignore = 1;
                }
        }
        if (ignore) {

------------------------------------------------------------------------
[2012-12-20 15:31:55] kotlyar dot maksim at gmail dot com

Change php version

------------------------------------------------------------------------
[2012-12-20 15:29:23] kotlyar dot maksim at gmail dot com

Description:
------------
Order of implemented interfaces should make any difference. But it is not the 
case. If I implement child interface and parent after I will get a fatal error


Test script:
---------------
<?php
ini_set('display_errors', 1);
error_reporting(-1);


interface RootInterface
{
    function foo();
}

interface FirstChildInterface extends RootInterface
{
    function foo();
}

interface SecondChildInterface extends RootInterface
{
    function foo();
}

//works fine.
class A implements FirstChildInterface, SecondChildInterface
{
    function foo()
    {
    }
}

//also ok.
class B implements RootInterface, FirstChildInterface
{
    function foo()
    {
    }
}

//there is a fatal error.
class C implements FirstChildInterface, RootInterface 
{
    function foo()
    {
    }
}

Expected result:
----------------
Should work without errors(as previous examples).

Actual result:
--------------
PHP Fatal error:  Class C cannot implement previously implemented interface 
RootInterface in /foo/test.php on line 35
PHP Stack trace:
PHP   1. {main}() /foo/test.php:0

Fatal error: Class C cannot implement previously implemented interface 
RootInterface in /foo/test.php on line 35

Call Stack:
    0.0008     238784   1. {main}() /foo/test.php:0


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=63816&edit=1

Reply via email to