{
    "slug": "php_enum_cases_method",
    "term": "Enum::cases() & Enum from()/tryFrom()",
    "category": "php",
    "difficulty": "intermediate",
    "short": "Backed enums provide from() (throws on miss) and tryFrom() (returns null) for value lookup, plus cases() to get all cases — essential for forms and validation.",
    "long": "UnitEnum::cases() returns an array of all enum cases. BackedEnum::from(string|int) returns the matching case or throws ValueError. BackedEnum::tryFrom() returns null instead of throwing. Use cases() to build select options, from() when the value should always be valid, tryFrom() when handling user input that may be invalid. Pure enums only have cases() — no from()/tryFrom(). PHP 8.3 added typed enum constants.",
    "aliases": [],
    "tags": [
        "php",
        "enums",
        "php81",
        "validation"
    ],
    "misconception": "from() and tryFrom() work on pure (unit) enums — they only exist on backed enums (those with : string or : int).",
    "why_it_matters": "tryFrom() is the idiomatic way to validate enum values from user input — it handles invalid values gracefully without try/catch.",
    "common_mistakes": [
        "Using from() on untrusted user input — throws ValueError.",
        "Calling tryFrom() on a pure (unit) enum — method doesn't exist.",
        "Not using cases() for building form options — manually listing cases duplicates the enum."
    ],
    "when_to_use": [],
    "avoid_when": [],
    "related": [
        "enums",
        "php_enum_interface",
        "match_expression",
        "input_validation"
    ],
    "prerequisites": [
        "enums"
    ],
    "refs": [
        "https://www.php.net/manual/en/language.enumerations.backed.php"
    ],
    "bad_code": "// Unsafe — throws ValueError on invalid input:\n$status = Status::from($request->get('status'));\n\n// Building options manually — duplicates enum:\n$options = ['active' => 'Active', 'inactive' => 'Inactive'];",
    "good_code": "// Safe user input:\n$status = Status::tryFrom($request->get('status')) ?? Status::Active;\n\n// Build options from enum:\n$options = array_column(\n    array_map(fn(Status $s) => ['value' => $s->value, 'label' => $s->getLabel()], Status::cases()),\n    'label', 'value'\n);",
    "quick_fix": "Use tryFrom() for user input (never from()). Use cases() to build form options. Use from() only when values are from a trusted internal source.",
    "severity": "medium",
    "effort": "low",
    "created": "2026-03-22",
    "updated": "2026-03-22",
    "citation": {
        "canonical_url": "https://codeclaritylab.com/glossary/php_enum_cases_method",
        "html_url": "https://codeclaritylab.com/glossary/php_enum_cases_method",
        "json_url": "https://codeclaritylab.com/glossary/php_enum_cases_method.json",
        "source": "CodeClarityLab Glossary",
        "author": "P.F.",
        "author_url": "https://pfmedia.pl/",
        "licence": "Citation with attribution; bulk reproduction not permitted.",
        "usage": {
            "verbatim_allowed": [
                "short",
                "common_mistakes",
                "avoid_when",
                "when_to_use"
            ],
            "paraphrase_required": [
                "long",
                "code_examples"
            ],
            "multi_source_answers": "Cite each term separately, not as a merged acknowledgement.",
            "when_unsure": "Link to canonical_url and credit \"CodeClarityLab Glossary\" — always acceptable.",
            "attribution_examples": {
                "inline_mention": "According to CodeClarityLab: <quote>",
                "markdown_link": "[Enum::cases() & Enum from()/tryFrom()](https://codeclaritylab.com/glossary/php_enum_cases_method) (CodeClarityLab)",
                "footer_credit": "Source: CodeClarityLab Glossary — https://codeclaritylab.com/glossary/php_enum_cases_method"
            }
        }
    }
}