Switch en PHP o ofuscación de código

Cruce de vias de trenesEstoy realizando un curso de formación, y en el capítulo de PHP estoy volviendo a dar temas que he dado más de 30 veces: variables, operadores condicionales, iteradores, asignaciones, tipos de variables, … Dicen que siempre se aprende algo nuevo, y esta vez estoy estudiando mucho más a fondo cada comando que puedo utilizar, para saber cual es mejor en cada situación.

Estudiando el operador condicional switch, se me ha planteado el siguiente código, que me ha costado basante entenderlo por lo rocambolesco que es (parecía que ofuscación de código):

function flavor($type = null)
{
    switch ($type) {
        /* Note the isolation of break; statements and the fact that default: is at the top */
        default:
            $type = null;
        case $array[] = "chocolate":
            if ($type != null) {
                $array = array($type);
                break;
            }
        case $array[] = "strawberry":
            if ($type != null) {
                $array = array($type);
                break;
            }
        case $array[] = "vanilla":
            if ($type != null) {
                $array = array($type);
                break;
            }
    }
    if ( (count($array) != 1) ) {
        return "Flavors available: " . implode(", ", $array);
    } else {
        return "Flavor selected: " . implode(", ", $array);
    }
}
 
echo flavor() . "
";
/* Flavors available: chocolate, strawberry, vanilla */
 
echo flavor("banana") . "
";
/* Flavors available: chocolate, strawberry, vanilla */
 
echo flavor("chocolate") . "
";
/* Flavor selected: chocolate */

Para entenderlo, hay que tener en cuenta las siguientes consideraciones:

  • Normalmente, el caso “default” se coloca al final del “switch“. Aunque se coloque al principio de todo, se seguirá ejecutando solamente cuando no se produzca correctamente ninguna comparación de cada caso. Si se ejecuta y en el interior no contiene un “break“, ejecutará su código y el de todos los casos existentes hasta que encuentre un “break“.
  • Cuando se añade un nuevo elemento a un array, la asignación retorna el valor añadido. Mejor un ejemplo no? ;)
    $array = array();
    $bar = ($array[] = "foo");
    var_dump( $bar );
    var_dump( $array );
    string 'foo' (length=3)
     
    array
      0 => string 'foo' (length=3)

Intentado traducir el código a algo más legible, me ha quedado algo así:

function flavor2 ( $type = null )
{
	$flavors = array (
		  'chocolate'
		, 'strawberry'
		, 'vanilla'
	);
 
        if ( NULL !== $type && in_array( $type, $flavors ) )
            return 'Flavor selected: ' . $type;
        }
        return 'Flavors available: ' . implode( ', ', $flavors );
 
}

Esta entrada se la dedico a Eric Serrat, porque con este código, le hubiera hecho venir a sentarse conmigo y lo hubiéramos hecho juntos.

2 comentarios en “Switch en PHP o ofuscación de código

  1. Vaya tela!

    Para hacer esto necesito 3 chutes de Coca-Cola :D

    Pero yo me sé de alguien que en comparación esto es un juego de niños….
    Model_Gateway_Db_X extends Model_Gateway_Db_XAbstract extends…. extends….

  2. Thanks for the great information. I’m rnadieg through some journals for a research project in class, but a lot of the journals referred to algorithms that went a bit over my head, being a first semester computer science major. Thanks for such clear, concise explanations!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>