Merge branch 'PHP-8.2' into PHP-8.3

* PHP-8.2:
  Fix GH-14480: Method visibility issue introduced in version 8.3.8 (#14484)
This commit is contained in:
Dmitry Stogov 2024-06-05 23:59:37 +03:00
commit ee7d35cc4d
No known key found for this signature in database
2 changed files with 66 additions and 4 deletions

60
Zend/tests/gh14480.phpt Normal file
View File

@ -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

View File

@ -2018,12 +2018,14 @@ 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 |
ZEND_INHERITANCE_RESET_CHILD_OVERRIDE;
}
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 |
ZEND_INHERITANCE_RESET_CHILD_OVERRIDE);
ce, NULL, flags);
}
}
/* }}} */