Fix GH-14480: Method visibility issue introduced in version 8.3.8
authorDmitry Stogov <dmitry@zend.com>
Wed, 5 Jun 2024 16:56:13 +0000 (19:56 +0300)
committerOndřej Surý <ondrej@debian.org>
Mon, 24 Jun 2024 11:16:58 +0000 (13:16 +0200)
Gbp-Pq: Name 0049-Fix-GH-14480-Method-visibility-issue-introduced-in-v.patch

Zend/tests/gh14480.phpt [new file with mode: 0644]
Zend/zend_inheritance.c

diff --git a/Zend/tests/gh14480.phpt b/Zend/tests/gh14480.phpt
new file mode 100644 (file)
index 0000000..bab7478
--- /dev/null
@@ -0,0 +1,60 @@
+--TEST--
+GH-14480: Method visibility issue
+--FILE--
+<?php
+trait PropertyHelperTrait
+{
+    protected function splitPropertyParts(): void
+    {
+           echo "OK\n";
+    }
+}
+
+trait OrmPropertyHelperTrait
+{
+    abstract protected function splitPropertyParts(): void;
+    
+    protected function addJoinsForNestedProperty(): void
+    {
+        $this->splitPropertyParts();
+    }
+}
+
+trait SearchFilterTrait
+{
+    use PropertyHelperTrait;
+}
+
+abstract class AbstractFilter
+{
+    use OrmPropertyHelperTrait, PropertyHelperTrait;
+    
+    public function apply(): void
+    {
+        $this->filterProperty();
+    }
+    
+    abstract protected function filterProperty(): void;
+}
+
+class SearchFilter extends AbstractFilter
+{
+    use SearchFilterTrait;
+    protected function filterProperty(): void
+    {
+        $this->addJoinsForNestedProperty();
+    }
+}
+
+class FilterExtension
+{
+    public function applyToCollection(): void
+    {
+        (new SearchFilter())->apply();
+    }
+}
+
+(new FilterExtension)->applyToCollection();
+?>
+--EXPECT--
+OK
index 8c7ea963891bf53adda88e92486def3c00d1edb0..2e9bf25b59c48fc780d54bad4178a7744bac7cdc 100644 (file)
@@ -1933,11 +1933,13 @@ static void zend_add_trait_method(zend_class_entry *ce, zend_string *name, zend_
        if (check_inheritance) {
                /* Inherited members are overridden by members inserted by traits.
                 * Check whether the trait method fulfills the inheritance requirements. */
+               uint32_t flags = ZEND_INHERITANCE_CHECK_PROTO | ZEND_INHERITANCE_CHECK_VISIBILITY;
+               if (!(existing_fn->common.scope->ce_flags & ZEND_ACC_TRAIT)) {
+                       flags |= ZEND_INHERITANCE_SET_CHILD_CHANGED |ZEND_INHERITANCE_SET_CHILD_PROTO;
+               }
                do_inheritance_check_on_method(
                        fn, fixup_trait_scope(fn, ce), existing_fn, fixup_trait_scope(existing_fn, ce),
-                       ce, NULL,
-                       ZEND_INHERITANCE_CHECK_PROTO | ZEND_INHERITANCE_CHECK_VISIBILITY |
-                       ZEND_INHERITANCE_SET_CHILD_CHANGED| ZEND_INHERITANCE_SET_CHILD_PROTO);
+                       ce, NULL, flags);
        }
 }
 /* }}} */