mirror of
https://github.com/php/php-src.git
synced 2024-09-21 18:07:23 +00:00
Fixed bug #77325
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:
parent
30c2388738
commit
0d06a63ee3
2
NEWS
2
NEWS
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
29
ext/reflection/tests/bug77325.phpt
Normal file
29
ext/reflection/tests/bug77325.phpt
Normal 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"
|
Loading…
Reference in New Issue
Block a user