summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--Zend/tests/traits/bug63911.phpt26
-rw-r--r--Zend/zend_inheritance.c5
3 files changed, 33 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 152e3de3df..a86a3bfc00 100644
--- 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
index 0000000000..72892cdd34
--- /dev/null
+++ b/Zend/tests/traits/bug63911.phpt
@@ -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
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index c7391f96f7..7f253d90ea 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -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 */