?? ??? ????, PHP 7.3.0beta3
- Core:
+ . Fixed #76773 (Traits used on the parent are ignored for child classes).
+ (daverandom)
. Fixed #76767 (‘asm’ operand has impossible constraints in zend_operators.h).
(ondrej)
. Fixed bug #76754 (parent private constant in extends class memory leak).
--- /dev/null
+--TEST--
+Bug #76773 (Traits used on the parent are ignored for child classes)
+--FILE--
+<?php
+
+trait MyTrait
+{
+ public function hello()
+ {
+ echo __CLASS__, "\n";
+
+ if (\is_callable(array('parent', __FUNCTION__))) {
+ parent::hello();
+ }
+ }
+}
+
+class ParentClass
+{
+ use MyTrait;
+}
+
+class ChildClass extends ParentClass
+{
+ use MyTrait;
+}
+
+$c = new ChildClass();
+$c->hello();
+
+--EXPECT--
+ChildClass
+ParentClass
zend_function *new_fn;
if ((existing_fn = zend_hash_find_ptr(&ce->function_table, key)) != NULL) {
- /* if it is the same function with the same visibility regardless of where it is coming from */
- /* there is no conflict and we do not need to add it again */
+ /* if it is the same function with the same visibility and has not been assigned a class scope yet, 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 &&
- (existing_fn->common.fn_flags & ZEND_ACC_PPP_MASK) == (fn->common.fn_flags & ZEND_ACC_PPP_MASK)) {
+ (existing_fn->common.fn_flags & ZEND_ACC_PPP_MASK) == (fn->common.fn_flags & ZEND_ACC_PPP_MASK) &&
+ (existing_fn->common.scope->ce_flags & ZEND_ACC_TRAIT) == ZEND_ACC_TRAIT) {
return;
}