--- /dev/null
+--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
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);
}
}
/* }}} */