]> granicus.if.org Git - php/commitdiff
63911: Compare opcodes of the op_array to determine different functions
authorPedro Magalhães <mail@pmmaga.net>
Sat, 30 Sep 2017 20:24:38 +0000 (21:24 +0100)
committerkrakjoe <krakjoe@php.net>
Wed, 22 Nov 2017 05:35:24 +0000 (05:35 +0000)
NEWS
Zend/tests/traits/bug63911.phpt [new file with mode: 0644]
Zend/zend_inheritance.c

diff --git a/NEWS b/NEWS
index 152e3de3df747ae8438a9eee5c069799b93bd4a8..a86a3bfc004c3737487c53727c66a40cf7ae7578 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,8 @@ PHP                                                                        NEWS
     files). (petk)
   . Fixed bug #74922 (Composed class has fatal error with duplicate, equal const
     properties). (pmmaga)
+  . Fixed bug #63911 (identical trait methods raise errors during composition). 
+    (pmmaga)
 
 - BCMath:
   . Fixed bug #66364 (BCMath bcmul ignores scale parameter). (cmb)
diff --git a/Zend/tests/traits/bug63911.phpt b/Zend/tests/traits/bug63911.phpt
new file mode 100644 (file)
index 0000000..72892cd
--- /dev/null
@@ -0,0 +1,26 @@
+--TEST--
+Bug #63911 (Ignore conflicting trait methods originationg from identical sub traits)
+--FILE--
+<?php
+trait A
+{
+    public function a(){
+        echo 'Done';
+    }
+}
+trait B
+{
+    use A;
+}
+trait C
+{
+    use A;
+}
+class D
+{
+    use B, C;
+}
+
+(new D)->a();
+--EXPECT--
+Done
index c7391f96f7eb373607e6269483ad63cac8a9456e..7f253d90eac11e5a04d7ed403f881dd9ea459583 100644 (file)
@@ -1165,6 +1165,11 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_s
        zend_function *new_fn;
 
        if ((existing_fn = zend_hash_find_ptr(&ce->function_table, key)) != NULL) {
+               /* if it is the same function regardless of where it is coming from, there is no conflict and we do not need to add it again */
+               if (existing_fn->op_array.opcodes == fn->op_array.opcodes) {
+                       return;
+               }
+
                if (existing_fn->common.scope == ce) {
                        /* members from the current class override trait methods */
                        /* use temporary *overriden HashTable to detect hidden conflict */