Bug #63816 [Com]: implementation child interface and after parent cause fatal error.

From: Date: Wed, 09 Jan 2013 10:49:51 +0000
Subject: Bug #63816 [Com]: implementation child interface and after parent cause fatal error.
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-175909@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=63816&edit=1

 ID:                 63816
 Comment by:         kotlyar dot maksim at gmail dot com
 Reported by:        kotlyar dot maksim at gmail dot com
 Summary:            implementation child interface and after parent
                     cause fatal error.
 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:

@dmitry I see you reason. I am completely agree with you that be silent and allow 
two same interface is not a good solution.

But from the other side. I believed that I could implement interface in any order 
I want. Ordering of interfaces(maybe should be?) is not documented anywhere.
Also the described situation could be resolved without a fatal error so it at 
least not developer friendly.


Previous Comments:
------------------------------------------------------------------------
[2013-01-09 09:41:18] dmitry@php.net

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.

------------------------------------------------------------------------
[2013-01-05 05:37:24] laruence@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


Thread (13 messages)

« previous php.bugs (#175909) next »