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