Почему аргумент case в инструкции switch, который не содержит разрыв, автоматически переходит в следующий случай без проверки?
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(); }
Если параметр «создан», он выполнит проверку в созданном случае, что хорошо. Когда проверка будет успешной, я хочу, чтобы код продолжал установку по умолчанию, поэтому нет перерыва ;. Но вместо этого он продолжает «Создатель», а $ param! = «Создатель»!
Я знаю, как это решить (просто добавьте код по умолчанию в мой случай «created»), но я не люблю повторять этот код слишком часто. Мой фактический вопрос: почему он продолжается с «Творцом», в то время как дело не «Создатель».
Патч был преднамеренной конструктивной особенностью, позволяющей использовать код:
switch ($command) { case "exit": case "quit": quit(); break; case "reset": stop(); case "start": start(); break; }
Он сконструирован таким образом, что выполнение заканчивается от случая к случаю.
default
– это случай, как и любой другой, за исключением того, что прыжки происходят, если никакой другой случай не был вызван. Это никоим образом не означает «сделать это после выполнения инструкции по конкретному выбранному случаю». В вашем примере вы можете подумать:
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;
Эмпирическое правило здесь, если оно не зависит от коммутатора, вытащите его из коммутатора.
Потому что так оно и делается на C.
Возможно, это просветит вас:
Перейти к началу страницы
Чтобы ответить на ваш «фактический вопрос»: почему он продолжает работу с «Творцом», в то время как дело не «Создатель».
Потому что у тебя нет break
. Без этого он будет продолжать рассмотрение дел ниже. Единственное решение, о котором я могу думать, это положить код по умолчанию в дела и добавить break
.
Кроме того, вам не нужно break
случай по умолчанию, так как его последний случай в блоке коммутатора.
Я действительно не понимаю, чего вы хотите.
Все инструменты есть.