cambiar instrucción sin descanso

¿Cómo es que una opción de caso en una statement de cambio que no contiene una interrupción avanza automáticamente a un próximo caso sin verificación?

try { switch($param) { case "created": if(!($value instanceof \DateTime)) throw new \Exception("\DateTime expected, ".gettype($value)." given for self::$param"); case "Creator": if(!($value instanceof \Base\User)) { throw new \Exception(get_class($value)." given. \Base\User expected for self::\$Creator"); } default: $this->$param = $value; break; } } catch(Exception $e) { echo $e->getMessage(); } 

Si el param es “creado”, hará el control en el caso creado, lo cual es bueno. Cuando el control es exitoso, quiero que el código continúe con la opción predeterminada, es por eso que no hay interrupción ;. ¡Pero continúa “Creador” mientras que $ param! = “Creador”!

Sé cómo resolver esto (simplemente agregue el código predeterminado en mi caso “creado”), pero no me gusta repetir ese código con demasiada frecuencia. Mi verdadera pregunta es: ¿por qué continúa con el caso del “Creador” mientras que el caso no es “Creador”?

Fallthrough fue una característica de diseño intencional para permitir código como:

 switch ($command) { case "exit": case "quit": quit(); break; case "reset": stop(); case "start": start(); break; } 

Está diseñado para que la ejecución se ejecute de caso en caso.

default es un caso como cualquier otro, excepto que saltar allí ocurre si no se desencadenó ningún otro caso. No es de ninguna manera una instrucción “haz esto después de ejecutar el caso seleccionado real”. En tu ejemplo, podrías considerar:

  switch($param) { case "created": if(!($value instanceof \DateTime)) throw new \Exception("\DateTime expected, ".gettype($value)." given for self::$param"); break; case "Creator": if(!($value instanceof \Base\User)) { throw new \Exception(get_class($value)." given. \Base\User expected for self::\$Creator"); } break; } $this->$param = $value; 

La regla general es que, si no depende del interruptor, aléjelo del interruptor.

Porque así es como se hace en C.

Tal vez esto te ilumine:

Jump Table Switch Case pregunta

Para responder a su “pregunta real”: ¿Por qué continúa con el caso “Creador” mientras que el caso no es “Creador”?

Porque no tienes break . Sin él, continuará a los casos debajo de él. La única solución en la que puedo pensar es poner el código predeterminado en los casos y agregar un break .

Además, no necesita break en el caso predeterminado ya que es el último caso en el bloque de interruptor.

Realmente no veo lo que quieres.

  1. Si desea ejecutar las cosas predeterminadas en todos los casos, simplemente colóquelo después del cambio.
  2. Si desea ejecutar las cosas predeterminadas solo en el caso “creado” y en el caso predeterminado, cambie la posición de las secciones “creado” y “Creador” y ponga un descanso después de la primera.
  3. Si desea que el código solo se ejecute si Creator o creado coincide, entonces deshágase de la instrucción switch y use un if / else O utilice un indicador y una siguiente instrucción if.

Todas las herramientas están ahí.