|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-12-20 15:29 UTC] 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
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Oct 27 08:00:01 2025 UTC |
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) {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.Dmitry wrote: "it's not a big deal to fix a script once you see this FATAL error." Why should people have to fix their script. There is nothing wrong with their code, PHP is just being a bit dumb. "so the following buggy code becomes legal. <?php interface foo {} class bar implements foo, foo {} ?> " I don't see the problem. All that implementing an interface does is say that a class must implement certain methods with particular signatures. Although implementing an interface multiple times doesn't add anything, I can't see the problem for the simple case, But for more complex cases where someone has multiple classes that implement various interfaces, including the "\Serializable" interface. They then realise that one of the user-defined interfaces should actually extend "\Serializable". Doing that, would make some code break, depending on what order the implements interfaces was written as. That's a real problem that imo people shouldn't have to 'fix their scripts' for.