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] [email protected]
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] [email protected]
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