diff --git a/lib/VM.php b/lib/VM.php index 5d3793291d5..f21ef81b8f0 100755 --- a/lib/VM.php +++ b/lib/VM.php @@ -2293,6 +2293,13 @@ private function collectDebugPropertiesForBuiltin(ObjectEntry $object, Frame $fr */ public function collectObjectVarsForBuiltin(ObjectEntry $object, Frame $frame): array { + // Enum cases: Zend zend_enum.c name/value pseudo-properties (foreach + get_object_vars; #23433). + if (VM\EnumCaseSupport::isEnumCase($object)) { + $caseVar = new Variable(Variable::TYPE_OBJECT); + $caseVar->object($object); + + return VM\EnumCaseSupport::objectVarsForCaseVariable($caseVar); + } // DateInterval: Zend date_interval_get_properties — public wire despite isInternal (#22446). $dateMap = $this->dateIntervalObjectVarsPropertyMap($object); if (null !== $dateMap) { diff --git a/test/compliance/EnumVMTest.php b/test/compliance/EnumVMTest.php index 19d1d5d10fd..64bfdd7e8ad 100644 --- a/test/compliance/EnumVMTest.php +++ b/test/compliance/EnumVMTest.php @@ -84,6 +84,7 @@ public static function providePHPTests(): \Generator 'enum_in_operator.phpt', 'foreach_enum_case_by_value.phpt', 'foreach_enum_case_by_ref.phpt', + 'foreach_enum_case_properties.phpt', 'foreach_byref_enum.phpt', 'enum_destructure_static.phpt', 'list_destructure_enum_case.phpt', diff --git a/test/compliance/cases/language/foreach_enum_case_properties.phpt b/test/compliance/cases/language/foreach_enum_case_properties.phpt new file mode 100644 index 00000000000..24e36b8aa05 --- /dev/null +++ b/test/compliance/cases/language/foreach_enum_case_properties.phpt @@ -0,0 +1,20 @@ +--TEST-- +Language: foreach(enum case) yields name (+ value if backed) (#23433, Zend/zend_enum.c) +--FILE-- + $v) { $ks[] = "$k=" . var_export($v, true); } +echo implode(",", $ks), "\n"; +enum S: string { case A = "x"; } +$ks = []; +foreach (S::A as $k => $v) { $ks[] = "$k=" . var_export($v, true); } +echo implode(",", $ks), "\n"; +enum I: int { case A = 7; } +$ks = []; +foreach (I::A as $k => $v) { $ks[] = "$k=" . var_export($v, true); } +echo implode(",", $ks), "\n"; +--EXPECT-- +name='A' +name='A',value='x' +name='A',value=7