<?php
enum E: int { case C = 3; case A = 1; case B = 2; }
var_export(E::cases());
echo count(E::cases()), "\n";
foreach (E::cases() as $case) {
echo $case->name, " ";
}
echo "\n";
enum U { case A; case B; }
echo count(U::cases()), "\n";
echo U::cases()[0]->name, "\n";
Category
language· php-src-strict · regression guardProblem
BackedEnum::cases()andUnitEnum::cases()must return a list of enum case objects in declaration order. Closed #5462, #5507, and #9682 fixed this previously; VM regressed again — static call succeeds but returnsarray(0) { }.Breaks spread/unpack (
[...E::cases()]), reflection (#9606), iterators, and any bootstrap code enumerating enum cases.php-src reference
Zend/zend_enum.c—zend_enum_list_cases, case tableZend/zend_interfaces.c—UnitEnum::casesinternal methodZend/tests/enums/backed_enum_cases.phpt,enum_cases.phptRepro (failure today)
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && php bin/vm.php repro_enum_cases.php'array(3){enum(E::C),enum(E::A),enum(E::B)}, prints3,C A B, unit enum2+Aarray(0){}, prints0, empty foreach, unit enum0Scope (PHP-in-PHP)
lib/VM/Builtin/EnumCases.php— case list materialization from enum registrylib/VM.php/ enum compile metadata — ensureenumCasestable populated at class linklib/JIT/enumcases()lowering must match VM listtest/compliance/cases/language/enum_cases_*.phptDone when
C A B)test/unit/VmEnumCasesEmptyTableTest.phpgreenReflectionEnum::getCases()unblocked when Stdlib: ReflectionEnum::getCases() returns empty — must list ReflectionEnumCase objects (ext/reflection/php_reflection.c) #9606 landsRelated