From 1944c14ce7568617bad10e6d0121268d66ef8abe Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Thu, 28 Apr 2022 19:46:46 +0200 Subject: [PATCH] Fix ReflectionProperty::__toString() of properties containing enums Fix GH-8444 --- NEWS | 2 ++ ext/reflection/php_reflection.c | 7 +++++++ ext/reflection/tests/gh8444.phpt | 31 +++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 ext/reflection/tests/gh8444.phpt diff --git a/NEWS b/NEWS index 970a642f0435..6a51433ceab1 100644 --- a/NEWS +++ b/NEWS @@ -141,6 +141,8 @@ PHP NEWS - Reflection: . Fixed bug GH-8080 (ReflectionClass::getConstants() depends on def. order). (cmb) + . Fixed bug GH-8444 (Fix ReflectionProperty::__toString() of properties + containing instantiated enums). (ilutov) - Zlib: . Fixed bug GH-7953 (ob_clean() only does not set Content-Encoding). (cmb) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 2ae9f424f340..3ccd43d89e99 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -638,6 +638,13 @@ static int format_default_value(smart_str *str, zval *value) { format_default_value(str, zv); } ZEND_HASH_FOREACH_END(); smart_str_appendc(str, ']'); + } else if (Z_TYPE_P(value) == IS_OBJECT) { + zend_object *obj = Z_OBJ_P(value); + zend_class_entry *class = obj->ce; + ZEND_ASSERT(class->ce_flags & ZEND_ACC_ENUM); + smart_str_append(str, class->name); + smart_str_appends(str, "::"); + smart_str_append(str, Z_STR_P(zend_enum_fetch_case_name(obj))); } else { ZEND_ASSERT(Z_TYPE_P(value) == IS_CONSTANT_AST); zend_string *ast_str = zend_ast_export("", Z_ASTVAL_P(value), ""); diff --git a/ext/reflection/tests/gh8444.phpt b/ext/reflection/tests/gh8444.phpt new file mode 100644 index 000000000000..9629a8db3817 --- /dev/null +++ b/ext/reflection/tests/gh8444.phpt @@ -0,0 +1,31 @@ +--TEST-- +GH-8444 (Fix ReflectionProperty::__toString() of properties containing instantiated enums) +--FILE-- + +--EXPECT-- +Property [ public Foo $enum = Foo::Bar ] + +Property [ public $enumInArray = [Foo::Bar] ] + +Property [ public Foo $enum = Foo::Bar ] + +Property [ public $enumInArray = [Foo::Bar] ]