tengo enumeración básica
enum Fruit { case APPLE; case ORANGE; case BANANA; }y alguna función que usa escribir con esa enumeración:
function eatFruit (Fruit $fruit) { // do stuff }y variable con contenido desconocido
$fruit = $_POST['fruit']; // user choosed "MILK" if (?????) { // how to check if it's fruit? eatFruit($fruit); // this should not be executed }No puedo encontrar en la documentación una forma simple de verificar si la enumeración contiene un caso específico.
Es posible con enumeraciones respaldadas como esa
enum Fruit { case APPLE = 'APPLE'; case ORANGE = 'ORANGE'; case BANANA = 'BANANA'; } Fruit::from(''); Fruit::tryFrom(''); Esto funcionará, pero from no existe en enumeraciones sin respaldo de mi primer ejemplo.
Fatal error: Uncaught Error: Call to undefined method Fruit::from()Puede usar el método estático cases() para esto. Esto devuelve una matriz de todos los valores en la enumeración. Los valores tienen una propiedad de "nombre" que es una representación de cadena con la que puede verificar (las enumeraciones respaldadas también tienen una propiedad de "valor" que contiene el valor de cadena que definió en la enumeración).
Entonces, una implementación de ejemplo podría ser algo como:
enum Fruit { case APPLE; case ORANGE; case BANANA; } // String from user input $fruit = $_POST['fruit']; // Find matching fruit in all enum cases $fruits = Fruit::cases(); $matchingFruitIndex = array_search($fruit, array_column($fruits, "name")); // If found, eat it if ($matchingFruitIndex !== false) { $matchingFruit = $fruits[$matchingFruitIndex]; eatFruit($matchingFruit); } else { echo $fruit . " is not a valid Fruit"; } function eatFruit(Fruit $fruit): void { if ($fruit === Fruit::APPLE) { echo "An apple a day keeps the doctor away"; } elseif ($fruit === Fruit::ORANGE) { echo "When life gives you oranges, make orange juice"; } elseif ($fruit === Fruit::BANANA) { echo "Banana for scale"; } }Versión de trabajo con datos de muestra: https://3v4l.org/ObD3s
Si desea hacer esto más a menudo con diferentes enumeraciones, puede escribir una función auxiliar para esto:
function getEnumValue($value, $enumClass) { $cases = $enumClass::cases(); $index = array_search($value, array_column($cases, "name")); if ($index !== false) { return $cases[$index]; } return null; } $fruit = getEnumValue($_POST['fruit'], Fruit::class); if ($fruit !== null) { eatFruit($fruit); } else { echo $_POST['fruit'] . " is not a valid Fruit"; }Ejemplo con los mismos datos de muestra: https://3v4l.org/bL8Wa