Make ReflectionClassConstant->class the declaring class, not the
class on which the constant was fetched. This matches the behavior
for properties and methods.
This commit is contained in:
Nikita Popov 2020-02-28 17:19:37 +01:00
parent 30c2388738
commit 0d06a63ee3
3 changed files with 36 additions and 5 deletions

2
NEWS
View File

@ -87,6 +87,8 @@ PHP NEWS
Reflection::getDefaultValue (beberlei)
. Fixed bug #64592 (ReflectionClass::getMethods() returns methods out of
scope). (Nikita)
. Fixed bug #77325 (ReflectionClassConstant::$class returns wrong class when
extending). (Nikita)
- Session:
. Fixed bug #78624 (session_gc return value for user defined session

View File

@ -1245,7 +1245,7 @@ static void reflection_property_factory_str(zend_class_entry *ce, const char *na
}
/* {{{ reflection_class_constant_factory */
static void reflection_class_constant_factory(zend_class_entry *ce, zend_string *name_str, zend_class_constant *constant, zval *object)
static void reflection_class_constant_factory(zend_string *name_str, zend_class_constant *constant, zval *object)
{
reflection_object *intern;
@ -1257,7 +1257,7 @@ static void reflection_class_constant_factory(zend_class_entry *ce, zend_string
intern->ignore_visibility = 0;
ZVAL_STR_COPY(reflection_prop_name(object), name_str);
ZVAL_STR_COPY(reflection_prop_class(object), ce->name);
ZVAL_STR_COPY(reflection_prop_class(object), constant->ce->name);
}
/* }}} */
@ -3473,7 +3473,7 @@ ZEND_METHOD(reflection_class_constant, __construct)
intern->ce = constant->ce;
intern->ignore_visibility = 0;
ZVAL_STR_COPY(reflection_prop_name(object), constname);
ZVAL_STR_COPY(reflection_prop_class(object), ce->name);
ZVAL_STR_COPY(reflection_prop_class(object), constant->ce->name);
}
/* }}} */
@ -4346,7 +4346,7 @@ ZEND_METHOD(reflection_class, getReflectionConstants)
array_init(return_value);
ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->constants_table, name, constant) {
zval class_const;
reflection_class_constant_factory(ce, name, constant, &class_const);
reflection_class_constant_factory(name, constant, &class_const);
zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &class_const);
} ZEND_HASH_FOREACH_END();
}
@ -4395,7 +4395,7 @@ ZEND_METHOD(reflection_class, getReflectionConstant)
if ((constant = zend_hash_find_ptr(&ce->constants_table, name)) == NULL) {
RETURN_FALSE;
}
reflection_class_constant_factory(ce, name, constant, return_value);
reflection_class_constant_factory(name, constant, return_value);
}
/* }}} */

View File

@ -0,0 +1,29 @@
--TEST--
Bug #77325: ReflectionClassConstant::$class returns wrong class when extending
--FILE--
<?php
class Foo {
const FOO = 'foo';
}
class Bar extends Foo {
}
$barClassReflection = new ReflectionClass(Bar::class);
$constants = $barClassReflection->getReflectionConstants();
foreach ($constants as $constant) {
var_dump($constant->class);
var_dump($constant->getDeclaringClass()->getName());
}
$constant = new ReflectionClassConstant(Bar::class, 'FOO');
var_dump($constant->class);
var_dump($constant->getDeclaringClass()->getName());
?>
--EXPECT--
string(3) "Foo"
string(3) "Foo"
string(3) "Foo"
string(3) "Foo"