Repository navigation
Language: defined('Enum::CASE') — enum cases must be detectable (zend_constants.c) #4972
Copy link
Copy link
Closed
Labels
area:vmVirtual machineVirtual machineenhancementNew feature or requestNew feature or requestimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimSpec complete: repro, php-src ref, done-when — safe for workers to claimphase-2:languagePhase 2 – language featuresPhase 2 – language featuresphase-4:stdlibPhase 4 – stdlib for web appsPhase 4 – stdlib for web apps
Description
Category
language / stdlib — enum constant table + defined()
Problem
For backed/unit enums, Zend treats EnumName::CASE as a defined constant name for defined() and constant() (returns the enum case object). This compiler returns false from defined('E::A') even when E::A exists, and constant('E::A') throws Undefined constant.
Blocks reflection/bootstrap code that probes enum cases by name without hard-coding case objects.
php-src reference
- php/php-src
Zend/zend_constants.c— enum case registration in constant table - php/php-src
ext/standard/basic_functions.c—PHP_FUNCTION(defined),PHP_FUNCTION(constant) - php/php-src
Zend/zend_enum.c— case hash /zend_enum_get_case_by_name()
Repro
<?php
enum E: int {
case A = 1;
case B = 2;
}
var_dump(defined('E::A'));
var_dump(defined('E::Z'));
var_dump(constant('E::A'));./script/docker-exec.sh -- bash -lc 'source script/php-env.sh
php repro.php
php bin/vm.php repro.php
'| Check | Zend | This compiler VM |
|---|---|---|
defined('E::A') |
bool(true) |
bool(false) ❌ |
defined('E::Z') |
bool(false) |
bool(false) ✅ |
constant('E::A') |
enum(E::A) |
Undefined constant "E::A" ❌ |
Scope
| Layer | Path | Notes |
|---|---|---|
| VM | enum registration / constant lookup | Register case names like class constants |
| Stdlib | ext/standard/defined_.php, constant_.php |
Qualified Class::MEMBER path (#3484) must include enum cases |
| Tests | defined_enum_case.phpt, extend constant_class.phpt |
Backed + unit enums |
Done when
- Repro matches Zend table above on VM
-
constant('E::A') === E::A(see Stdlib: constant() — resolve user/class constant by name (ext/standard/basic_functions.c parity) #3484 — implement together or close duplicate) -
./script/ci-fast.sh --filter defined_enumgreen
Related
- Stdlib: constant() — resolve user/class constant by name (ext/standard/basic_functions.c parity) #3484 / Stdlib: constant() — resolve constant by name including Class::CONST (ext/standard/basic_functions.c parity) #3577 —
constant()class/enum lookup umbrella - Stdlib: var_dump() — enum cases must display enum(Foo::Bar) not unknown() (Zend/zend.c hash API) #4739 —
var_dump()enum case display - Stdlib: get_debug_type() — enum cases must return enum class name (ext/standard/type.c parity) #4260 —
get_debug_type()on enum cases
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:vmVirtual machineVirtual machineenhancementNew feature or requestNew feature or requestimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimSpec complete: repro, php-src ref, done-when — safe for workers to claimphase-2:languagePhase 2 – language featuresPhase 2 – language featuresphase-4:stdlibPhase 4 – stdlib for web appsPhase 4 – stdlib for web apps
Activity
PurHur commentedon Jun 5, 2026
claim: cursor-agent-lane-b — starting this run
Fix defined() for enum cases (#6020)
PurHur commentedon Jun 5, 2026
Merged via #6020.
Verification: