]> granicus.if.org Git - php/commitdiff
- Fixed bug #43200 (Interface implementation / inheritence not possible in abstract...
authorFelipe Pena <felipe@php.net>
Sat, 19 Nov 2011 13:36:03 +0000 (13:36 +0000)
committerFelipe Pena <felipe@php.net>
Sat, 19 Nov 2011 13:36:03 +0000 (13:36 +0000)
NEWS
Zend/tests/bug43200.phpt [new file with mode: 0644]
Zend/tests/bug43200_2.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/NEWS b/NEWS
index 40c0661eaf4d34316c0608dd86d58431a07f4f5a..203fe9e38e9c8b2c013a6a58aac59fc125b5abf9 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,10 @@ PHP                                                                        NEWS
     (klightspeed at netspace dot net dot au)
   . Fixed bug #52624 (tempnam() by-pass open_basedir with nonnexistent
     directory). (Felipe)
+    
+- Zend Engine:
+  . Fixed bug #43200 (Interface implementation / inheritence not possible in
+    abstract classes). (Felipe)
 
 - PHP-FPM SAPI:
   . Fixed bug #60179 (php_flag and php_value does not work properly). (fat)
diff --git a/Zend/tests/bug43200.phpt b/Zend/tests/bug43200.phpt
new file mode 100644 (file)
index 0000000..24a8bbb
--- /dev/null
@@ -0,0 +1,51 @@
+--TEST--
+Bug #43200 (Interface implementation / inheritence not possible in abstract classes)
+--FILE--
+<?php
+
+interface a {
+       function foo();
+       function bar();
+}
+interface b {
+       function foo();
+}
+
+abstract class c {
+       function bar() { }
+}
+
+class x extends c implements a, b {
+       function foo() { }
+}
+
+ReflectionClass::export('x');
+
+?>
+--EXPECTF--
+Class [ <user> class x extends c implements a, b ] {
+  @@ %s 15-17
+
+  - Constants [0] {
+  }
+
+  - Static properties [0] {
+  }
+
+  - Static methods [0] {
+  }
+
+  - Properties [0] {
+  }
+
+  - Methods [2] {
+    Method [ <user, prototype b> public method foo ] {
+      @@ %s 16 - 16
+    }
+
+    Method [ <user, inherits c, prototype a> public method bar ] {
+      @@ %s 12 - 12
+    }
+  }
+}
+
diff --git a/Zend/tests/bug43200_2.phpt b/Zend/tests/bug43200_2.phpt
new file mode 100644 (file)
index 0000000..5efc5fa
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Bug #43200.2 (Interface implementation / inheritence not possible in abstract classes)
+--FILE--
+<?php
+
+interface A {
+       function foo();
+}
+
+abstract class B implements A {
+       abstract public function foo();
+}
+
+class C extends B {
+       public function foo() {
+               echo 'works';
+       }
+}
+
+$o = new C();
+$o->foo();
+
+?>
+--EXPECTF--
+works
index 1248715f12d39981bafb623eba9451bb9c8ad4d8..0b881098cf6855f758d699ad43bc2dd42bc33df2 100644 (file)
@@ -2628,7 +2628,8 @@ static zend_bool do_inherit_method_check(HashTable *child_function_table, zend_f
                return 1; /* method doesn't exist in child, copy from parent */
        }
 
-       if (parent->common.fn_flags & ZEND_ACC_ABSTRACT
+       if ((parent->common.scope->ce_flags & ZEND_ACC_INTERFACE) == 0
+               && parent->common.fn_flags & ZEND_ACC_ABSTRACT
                && parent->common.scope != (child->common.prototype ? child->common.prototype->common.scope : child->common.scope)
                && child->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_IMPLEMENTED_ABSTRACT)) {
                zend_error(E_COMPILE_ERROR, "Can't inherit abstract function %s::%s() (previously declared abstract in %s)",