From 56c0a0092e7d796b3dd364c17193288525ab8a61 Mon Sep 17 00:00:00 2001 From: Savin Mikhail Date: Wed, 5 Nov 2025 19:06:14 +0300 Subject: [PATCH 01/10] Zend: Add ZEND_STR_VALUES interned string --- Zend/zend_string.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_string.h b/Zend/zend_string.h index fc7705ff78650..d51e17a15a272 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -625,6 +625,7 @@ EMPTY_SWITCH_DEFAULT_CASE() _(ZEND_STR_CASES, "cases") \ _(ZEND_STR_FROM, "from") \ _(ZEND_STR_TRYFROM, "tryFrom") \ + _(ZEND_STR_VALUES, "values") \ _(ZEND_STR_TRYFROM_LOWERCASE, "tryfrom") \ _(ZEND_STR_AUTOGLOBAL_SERVER, "_SERVER") \ _(ZEND_STR_AUTOGLOBAL_ENV, "_ENV") \ From 4da74a9cdd919c910aee0c3a79fa8b054c2950a3 Mon Sep 17 00:00:00 2001 From: Savin Mikhail Date: Wed, 5 Nov 2025 19:06:14 +0300 Subject: [PATCH 02/10] Zend: Add BackedEnum::values() static method --- Zend/zend_enum.c | 46 +++++++++++++++++++++++++++++++++++----- Zend/zend_enum.stub.php | 7 ++++++ Zend/zend_enum_arginfo.h | 5 ++++- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/Zend/zend_enum.c b/Zend/zend_enum.c index ae9e7b701213f..64ec215c777a4 100644 --- a/Zend/zend_enum.c +++ b/Zend/zend_enum.c @@ -410,9 +410,34 @@ static ZEND_NAMED_FUNCTION(zend_enum_from_func) static ZEND_NAMED_FUNCTION(zend_enum_try_from_func) { - zend_enum_from_base(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); + zend_enum_from_base(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); } +static ZEND_NAMED_FUNCTION(zend_enum_values_func) +{ + zend_class_entry *ce = execute_data->func->common.scope; + zend_class_constant *c; + + ZEND_PARSE_PARAMETERS_NONE(); + + array_init(return_value); + + ZEND_HASH_MAP_FOREACH_PTR(CE_CONSTANTS_TABLE(ce), c) { + if (!(ZEND_CLASS_CONST_FLAGS(c) & ZEND_CLASS_CONST_IS_CASE)) { + continue; + } + zval *zv = &c->value; + if (Z_TYPE_P(zv) == IS_CONSTANT_AST) { + if (zval_update_constant_ex(zv, c->ce) == FAILURE) { + RETURN_THROWS(); + } + } + zval *prop = zend_enum_fetch_case_value(Z_OBJ_P(zv)); + zval tmp; + ZVAL_COPY(&tmp, prop); + zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp); + } ZEND_HASH_FOREACH_END(); +} static void zend_enum_register_func(zend_class_entry *ce, zend_known_string_id name_id, zend_internal_function *zif) { zend_string *name = ZSTR_KNOWN(name_id); zif->type = ZEND_INTERNAL_FUNCTION; @@ -469,6 +494,16 @@ void zend_enum_register_funcs(zend_class_entry *ce) try_from_function->required_num_args = 1; try_from_function->arg_info = (zend_internal_arg_info *) (arginfo_class_BackedEnum_tryFrom + 1); zend_enum_register_func(ce, ZEND_STR_TRYFROM_LOWERCASE, try_from_function); + + zend_internal_function *values_function = zend_arena_calloc(&CG(arena), sizeof(zend_internal_function), 1); + values_function->handler = zend_enum_values_func; + values_function->function_name = ZSTR_KNOWN(ZEND_STR_VALUES); + values_function->fn_flags = fn_flags; + values_function->doc_comment = NULL; + values_function->num_args = 0; + values_function->required_num_args = 0; + values_function->arg_info = (zend_internal_arg_info *) (arginfo_class_BackedEnum_values + 1); + zend_enum_register_func(ce, ZEND_STR_VALUES, values_function); } } @@ -495,10 +530,11 @@ static const zend_function_entry unit_enum_methods[] = { }; static const zend_function_entry backed_enum_methods[] = { - ZEND_NAMED_ME(cases, zend_enum_cases_func, arginfo_class_UnitEnum_cases, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) - ZEND_NAMED_ME(from, zend_enum_from_func, arginfo_class_BackedEnum_from, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) - ZEND_NAMED_ME(tryFrom, zend_enum_try_from_func, arginfo_class_BackedEnum_tryFrom, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) - ZEND_FE_END + ZEND_NAMED_ME(cases, zend_enum_cases_func, arginfo_class_UnitEnum_cases, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) + ZEND_NAMED_ME(from, zend_enum_from_func, arginfo_class_BackedEnum_from, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) + ZEND_NAMED_ME(tryFrom, zend_enum_try_from_func, arginfo_class_BackedEnum_tryFrom, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) + ZEND_NAMED_ME(values, zend_enum_values_func, arginfo_class_BackedEnum_values, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) + ZEND_FE_END }; ZEND_API zend_class_entry *zend_register_internal_enum( diff --git a/Zend/zend_enum.stub.php b/Zend/zend_enum.stub.php index 727514a7bd4b7..bc0abe163c98f 100644 --- a/Zend/zend_enum.stub.php +++ b/Zend/zend_enum.stub.php @@ -12,4 +12,11 @@ interface BackedEnum extends UnitEnum public static function from(int|string $value): static; public static function tryFrom(int|string $value): ?static; + + /** + * Returns an indexed array of all backing values for the enum cases. + * + * @return int[]|string[] + */ + public static function values(): array; } diff --git a/Zend/zend_enum_arginfo.h b/Zend/zend_enum_arginfo.h index 64c36ff3c33af..809f5dcbf6df4 100644 --- a/Zend/zend_enum_arginfo.h +++ b/Zend/zend_enum_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 7092f1d4ba651f077cff37050899f090f00abf22 */ + * Stub hash: 9d13bd28cc1600d35c8494a1e98be14390cb0027 */ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_UnitEnum_cases, 0, 0, IS_ARRAY, 0) ZEND_END_ARG_INFO() @@ -12,6 +12,8 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_BackedEnum_tryFrom, 0, 1, ZEND_ARG_TYPE_MASK(0, value, MAY_BE_LONG|MAY_BE_STRING, NULL) ZEND_END_ARG_INFO() +#define arginfo_class_BackedEnum_values arginfo_class_UnitEnum_cases + static const zend_function_entry class_UnitEnum_methods[] = { ZEND_RAW_FENTRY("cases", NULL, arginfo_class_UnitEnum_cases, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_ABSTRACT, NULL, NULL) @@ -21,6 +23,7 @@ static const zend_function_entry class_UnitEnum_methods[] = { static const zend_function_entry class_BackedEnum_methods[] = { ZEND_RAW_FENTRY("from", NULL, arginfo_class_BackedEnum_from, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_ABSTRACT, NULL, NULL) ZEND_RAW_FENTRY("tryFrom", NULL, arginfo_class_BackedEnum_tryFrom, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_ABSTRACT, NULL, NULL) + ZEND_RAW_FENTRY("values", NULL, arginfo_class_BackedEnum_values, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC|ZEND_ACC_ABSTRACT, NULL, NULL) ZEND_FE_END }; From 38b650edccd32b49213a569d31ee91b79bf32228 Mon Sep 17 00:00:00 2001 From: Savin Mikhail Date: Wed, 5 Nov 2025 19:06:14 +0300 Subject: [PATCH 03/10] Reflection: Include BackedEnum::values() in ReflectionEnum and add reflection test --- .../tests/BackedEnum_values_reflection.phpt | 17 +++++++++++++++++ .../ReflectionEnum_toString_backed_int.phpt | 18 ++++++++++++++++-- .../ReflectionEnum_toString_backed_string.phpt | 18 ++++++++++++++++-- 3 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 ext/reflection/tests/BackedEnum_values_reflection.phpt diff --git a/ext/reflection/tests/BackedEnum_values_reflection.phpt b/ext/reflection/tests/BackedEnum_values_reflection.phpt new file mode 100644 index 0000000000000..ddc5a9438aa59 --- /dev/null +++ b/ext/reflection/tests/BackedEnum_values_reflection.phpt @@ -0,0 +1,17 @@ +--TEST-- +BackedEnum::values() appears in reflection +--FILE-- +isStatic()); +var_dump($method->isPublic()); +var_dump($method->getNumberOfParameters()); +?> +--EXPECT-- +bool(true) +bool(true) +int(0) + diff --git a/ext/reflection/tests/ReflectionEnum_toString_backed_int.phpt b/ext/reflection/tests/ReflectionEnum_toString_backed_int.phpt index 24ffbf918eaaa..790073d40a442 100644 --- a/ext/reflection/tests/ReflectionEnum_toString_backed_int.phpt +++ b/ext/reflection/tests/ReflectionEnum_toString_backed_int.phpt @@ -43,7 +43,7 @@ Enum [ enum MyBool: int implements MyStringable, UnitEnum, BackedEnum ] { - Static properties [0] { } - - Static methods [3] { + - Static methods [4] { Method [ static public method cases ] { - Parameters [0] { @@ -66,6 +66,13 @@ Enum [ enum MyBool: int implements MyStringable, UnitEnum, BackedEnum ] { } - Return [ ?static ] } + + Method [ static public method values ] { + + - Parameters [0] { + } + - Return [ array ] + } } - Properties [2] { @@ -99,7 +106,7 @@ Enum [ enum MyBool: int implements MyStringable, UnitEnum, BackedEnum ] { - Static properties [0] { } - - Static methods [3] { + - Static methods [4] { Method [ static public method cases ] { - Parameters [0] { @@ -122,6 +129,13 @@ Enum [ enum MyBool: int implements MyStringable, UnitEnum, BackedEnum ] { } - Return [ ?static ] } + + Method [ static public method values ] { + + - Parameters [0] { + } + - Return [ array ] + } } - Properties [2] { diff --git a/ext/reflection/tests/ReflectionEnum_toString_backed_string.phpt b/ext/reflection/tests/ReflectionEnum_toString_backed_string.phpt index 4c38d2b624b39..2f9a2492a6fd8 100644 --- a/ext/reflection/tests/ReflectionEnum_toString_backed_string.phpt +++ b/ext/reflection/tests/ReflectionEnum_toString_backed_string.phpt @@ -43,7 +43,7 @@ Enum [ enum MyBool: string implements MyStringable, UnitEnum, BackedEnum - Static properties [0] { } - - Static methods [3] { + - Static methods [4] { Method [ static public method cases ] { - Parameters [0] { @@ -66,6 +66,13 @@ Enum [ enum MyBool: string implements MyStringable, UnitEnum, BackedEnum } - Return [ ?static ] } + + Method [ static public method values ] { + + - Parameters [0] { + } + - Return [ array ] + } } - Properties [2] { @@ -99,7 +106,7 @@ Enum [ enum MyBool: string implements MyStringable, UnitEnum, BackedEnum - Static properties [0] { } - - Static methods [3] { + - Static methods [4] { Method [ static public method cases ] { - Parameters [0] { @@ -122,6 +129,13 @@ Enum [ enum MyBool: string implements MyStringable, UnitEnum, BackedEnum } - Return [ ?static ] } + + Method [ static public method values ] { + + - Parameters [0] { + } + - Return [ array ] + } } - Properties [2] { From 6316025a8795f806a5e12202bfea48011a1800bf Mon Sep 17 00:00:00 2001 From: Savin Mikhail Date: Wed, 5 Nov 2025 19:06:14 +0300 Subject: [PATCH 04/10] Tests: Add BackedEnum::values() test suite for enums --- Zend/tests/enum/backed-values-empty.phpt | 14 +++++++++++ .../backed-values-ignore-regular-consts.phpt | 20 ++++++++++++++++ Zend/tests/enum/backed-values-int.phpt | 24 +++++++++++++++++++ .../tests/enum/backed-values-not-on-pure.phpt | 15 ++++++++++++ Zend/tests/enum/backed-values-order.phpt | 21 ++++++++++++++++ Zend/tests/enum/backed-values-string.phpt | 24 +++++++++++++++++++ 6 files changed, 118 insertions(+) create mode 100644 Zend/tests/enum/backed-values-empty.phpt create mode 100644 Zend/tests/enum/backed-values-ignore-regular-consts.phpt create mode 100644 Zend/tests/enum/backed-values-int.phpt create mode 100644 Zend/tests/enum/backed-values-not-on-pure.phpt create mode 100644 Zend/tests/enum/backed-values-order.phpt create mode 100644 Zend/tests/enum/backed-values-string.phpt diff --git a/Zend/tests/enum/backed-values-empty.phpt b/Zend/tests/enum/backed-values-empty.phpt new file mode 100644 index 0000000000000..f440b9331e735 --- /dev/null +++ b/Zend/tests/enum/backed-values-empty.phpt @@ -0,0 +1,14 @@ +--TEST-- +Backed enums: values() on empty enum returns [] +--FILE-- + +--EXPECT-- +array(0) { +} + diff --git a/Zend/tests/enum/backed-values-ignore-regular-consts.phpt b/Zend/tests/enum/backed-values-ignore-regular-consts.phpt new file mode 100644 index 0000000000000..eb32ff356e180 --- /dev/null +++ b/Zend/tests/enum/backed-values-ignore-regular-consts.phpt @@ -0,0 +1,20 @@ +--TEST-- +BackedEnum::values() only returns case values, not regular constants +--FILE-- + +--EXPECT-- +array(2) { + [0]=> + string(1) "a" + [1]=> + string(1) "b" +} + diff --git a/Zend/tests/enum/backed-values-int.phpt b/Zend/tests/enum/backed-values-int.phpt new file mode 100644 index 0000000000000..f5f320801f9e3 --- /dev/null +++ b/Zend/tests/enum/backed-values-int.phpt @@ -0,0 +1,24 @@ +--TEST-- +Backed enums: values() returns ints +--FILE-- + +--EXPECT-- +array(3) { + [0]=> + int(1) + [1]=> + int(5) + [2]=> + int(10) +} + diff --git a/Zend/tests/enum/backed-values-not-on-pure.phpt b/Zend/tests/enum/backed-values-not-on-pure.phpt new file mode 100644 index 0000000000000..6c0477e4c0170 --- /dev/null +++ b/Zend/tests/enum/backed-values-not-on-pure.phpt @@ -0,0 +1,15 @@ +--TEST-- +Unit enums do not have values() +--FILE-- + +--EXPECT-- +bool(false) + diff --git a/Zend/tests/enum/backed-values-order.phpt b/Zend/tests/enum/backed-values-order.phpt new file mode 100644 index 0000000000000..9dd7cad1b8c62 --- /dev/null +++ b/Zend/tests/enum/backed-values-order.phpt @@ -0,0 +1,21 @@ +--TEST-- +BackedEnum::values() preserves declaration order +--FILE-- + +--EXPECT-- +array(3) { + [0]=> + int(3) + [1]=> + int(1) + [2]=> + int(2) +} + diff --git a/Zend/tests/enum/backed-values-string.phpt b/Zend/tests/enum/backed-values-string.phpt new file mode 100644 index 0000000000000..6e6bef355e977 --- /dev/null +++ b/Zend/tests/enum/backed-values-string.phpt @@ -0,0 +1,24 @@ +--TEST-- +Backed enums: values() returns strings +--FILE-- + +--EXPECT-- +array(3) { + [0]=> + string(3) "red" + [1]=> + string(5) "green" + [2]=> + string(4) "blue" +} + From 91a9daf045e3c67989bc493f2829aea755155f27 Mon Sep 17 00:00:00 2001 From: Savin Mikhail Date: Wed, 5 Nov 2025 19:06:14 +0300 Subject: [PATCH 05/10] Docs: NEWS, UPGRADING: Document BackedEnum::values() --- NEWS | 2 ++ UPGRADING | 2 ++ 2 files changed, 4 insertions(+) diff --git a/NEWS b/NEWS index 938aa1f72edb6..c7bb462d89c80 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,8 @@ PHP NEWS request. (ilutov) . It is now possible to use reference assign on WeakMap without the key needing to be present beforehand. (nielsdos) + . Added BackedEnum::values() to retrieve an indexed array of all backing + values for enum cases. (RFC: Add values() Method to BackedEnum) - Hash: . Upgrade xxHash to 0.8.2. (timwolla) diff --git a/UPGRADING b/UPGRADING index b0c30bc714576..f760c090843ab 100644 --- a/UPGRADING +++ b/UPGRADING @@ -30,6 +30,8 @@ PHP 8.6 UPGRADE NOTES - Core: . It is now possible to use reference assign on WeakMap without the key needing to be present beforehand. + . Added BackedEnum::values() static method to retrieve an indexed array of + all backing values for enum cases. - Intl: . Added IntlNumberRangeFormatter class to format an interval of two numbers with a given skeleton, locale, IntlNumberRangeFormatter::COLLAPSE_AUTO, IntlNumberRangeFormatter::COLLAPSE_NONE, IntlNumberRangeFormatter::COLLAPSE_UNIT, IntlNumberRangeFormatter::COLLAPSE_ALL collapse and From 941f17c8dab2be6bc01ad236f228b7ff93041e74 Mon Sep 17 00:00:00 2001 From: Savin Mikhail Date: Thu, 6 Nov 2025 21:18:32 +0300 Subject: [PATCH 06/10] Zend: Respect user-defined values() on BackedEnum --- Zend/zend_enum.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/Zend/zend_enum.c b/Zend/zend_enum.c index 64ec215c777a4..a255660948b34 100644 --- a/Zend/zend_enum.c +++ b/Zend/zend_enum.c @@ -495,15 +495,18 @@ void zend_enum_register_funcs(zend_class_entry *ce) try_from_function->arg_info = (zend_internal_arg_info *) (arginfo_class_BackedEnum_tryFrom + 1); zend_enum_register_func(ce, ZEND_STR_TRYFROM_LOWERCASE, try_from_function); - zend_internal_function *values_function = zend_arena_calloc(&CG(arena), sizeof(zend_internal_function), 1); - values_function->handler = zend_enum_values_func; - values_function->function_name = ZSTR_KNOWN(ZEND_STR_VALUES); - values_function->fn_flags = fn_flags; - values_function->doc_comment = NULL; - values_function->num_args = 0; - values_function->required_num_args = 0; - values_function->arg_info = (zend_internal_arg_info *) (arginfo_class_BackedEnum_values + 1); - zend_enum_register_func(ce, ZEND_STR_VALUES, values_function); + /* Avoid BC break: if user already declared values(), do not register native */ + if (!zend_hash_exists(&ce->function_table, ZSTR_KNOWN(ZEND_STR_VALUES))) { + zend_internal_function *values_function = zend_arena_calloc(&CG(arena), sizeof(zend_internal_function), 1); + values_function->handler = zend_enum_values_func; + values_function->function_name = ZSTR_KNOWN(ZEND_STR_VALUES); + values_function->fn_flags = fn_flags; + values_function->doc_comment = NULL; + values_function->num_args = 0; + values_function->required_num_args = 0; + values_function->arg_info = (zend_internal_arg_info *) (arginfo_class_BackedEnum_values + 1); + zend_enum_register_func(ce, ZEND_STR_VALUES, values_function); + } } } From ae7395ae0bcd7b1489d9935f069cb17b6f35a7f9 Mon Sep 17 00:00:00 2001 From: Savin Mikhail Date: Thu, 6 Nov 2025 21:18:40 +0300 Subject: [PATCH 07/10] Tests: Add user-defined BackedEnum::values() override test --- .../enum/backed-values-user-defined.phpt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Zend/tests/enum/backed-values-user-defined.phpt diff --git a/Zend/tests/enum/backed-values-user-defined.phpt b/Zend/tests/enum/backed-values-user-defined.phpt new file mode 100644 index 0000000000000..2a3d061a4c3d6 --- /dev/null +++ b/Zend/tests/enum/backed-values-user-defined.phpt @@ -0,0 +1,23 @@ +--TEST-- +Backed enums: user-defined values() overrides native +--FILE-- + +--EXPECT-- +array(1) { + [0]=> + string(6) "custom" +} + From b4d9250527f8326b02d870186bf1104ac95ec05a Mon Sep 17 00:00:00 2001 From: Savin Mikhail Date: Thu, 6 Nov 2025 21:26:40 +0300 Subject: [PATCH 08/10] Reflection: Add test for user-defined BackedEnum::values() --- ...edEnum_values_user_defined_reflection.phpt | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 ext/reflection/tests/BackedEnum_values_user_defined_reflection.phpt diff --git a/ext/reflection/tests/BackedEnum_values_user_defined_reflection.phpt b/ext/reflection/tests/BackedEnum_values_user_defined_reflection.phpt new file mode 100644 index 0000000000000..f2f10e89a8d81 --- /dev/null +++ b/ext/reflection/tests/BackedEnum_values_user_defined_reflection.phpt @@ -0,0 +1,29 @@ +--TEST-- +Reflection shows user-defined BackedEnum::values() when present +--FILE-- +isStatic()); +var_dump($m->isPublic()); +var_dump($m->isInternal()); +echo $m->getDeclaringClass()->getName(), "\n"; +$proto = $m->getPrototype(); +echo $proto->getDeclaringClass()->getName(), "\n"; + +?> +--EXPECT-- +bool(true) +bool(true) +bool(false) +E +BackedEnum + From 72b3c890c8c454d216092d7bab0d9b0ee8c403fc Mon Sep 17 00:00:00 2001 From: Savin Mikhail Date: Thu, 6 Nov 2025 21:35:39 +0300 Subject: [PATCH 09/10] Zend: Use EX(func) and avoid tmp zval copy in zend_enum_values_func() --- Zend/zend_enum.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Zend/zend_enum.c b/Zend/zend_enum.c index a255660948b34..6e437162b18bb 100644 --- a/Zend/zend_enum.c +++ b/Zend/zend_enum.c @@ -415,7 +415,7 @@ static ZEND_NAMED_FUNCTION(zend_enum_try_from_func) static ZEND_NAMED_FUNCTION(zend_enum_values_func) { - zend_class_entry *ce = execute_data->func->common.scope; + zend_class_entry *ce = EX(func)->common.scope; zend_class_constant *c; ZEND_PARSE_PARAMETERS_NONE(); @@ -433,9 +433,8 @@ static ZEND_NAMED_FUNCTION(zend_enum_values_func) } } zval *prop = zend_enum_fetch_case_value(Z_OBJ_P(zv)); - zval tmp; - ZVAL_COPY(&tmp, prop); - zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &tmp); + Z_TRY_ADDREF_P(prop); + zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), prop); } ZEND_HASH_FOREACH_END(); } static void zend_enum_register_func(zend_class_entry *ce, zend_known_string_id name_id, zend_internal_function *zif) { From 0095c977e4083927cd7c6c9104a1e8b526a67bff Mon Sep 17 00:00:00 2001 From: Savin Mikhail Date: Fri, 7 Nov 2025 06:28:56 +0300 Subject: [PATCH 10/10] Reflection: Add test for user-defined BackedEnum::values() --- ...edEnum_values_user_defined_reflection.phpt | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/ext/reflection/tests/BackedEnum_values_user_defined_reflection.phpt b/ext/reflection/tests/BackedEnum_values_user_defined_reflection.phpt index f2f10e89a8d81..b8b968ccd36b2 100644 --- a/ext/reflection/tests/BackedEnum_values_user_defined_reflection.phpt +++ b/ext/reflection/tests/BackedEnum_values_user_defined_reflection.phpt @@ -1,29 +1,29 @@ --TEST-- -Reflection shows user-defined BackedEnum::values() when present +BackedEnum: reflection shows whether values() is native or user-defined --FILE-- $c->value, self::cases()); } } -$m = new ReflectionMethod(E::class, 'values'); -var_dump($m->isStatic()); -var_dump($m->isPublic()); -var_dump($m->isInternal()); -echo $m->getDeclaringClass()->getName(), "\n"; -$proto = $m->getPrototype(); -echo $proto->getDeclaringClass()->getName(), "\n"; +$nativeMethod = new ReflectionMethod(NativeEnum::class, 'values'); +$userMethod = new ReflectionMethod(UserEnum::class, 'values'); + +echo "Native is internal: " . ($nativeMethod->isInternal() ? 'yes' : 'no') . "\n"; +echo "User is internal: " . ($userMethod->isInternal() ? 'yes' : 'no') . "\n"; ?> --EXPECT-- -bool(true) -bool(true) -bool(false) -E -BackedEnum - +Native is internal: yes +User is internal: no