Intereting Posts
Как создать всплывающее окно (модальное диалоговое окно) в HTML OAuth 1.0 Генерация подписи с PHP Создание матрицы совпадения из базы данных mysql в MYSQL, PHP или R Отображение изображений Google на моем веб-сайте? (пересмотренный) Советы по управлению большим количеством файлов? Как отправить sms с использованием php-скрипта с ftp-сервера Заменить только первое совпадение, используя preg_replace PHP конвертирует XML в группу JSON, когда есть один ребенок Неожиданный скобок ' Как проверить уникальность коллекции «многие-ко-многим»? Как разрешить ошибку cURL 60: сертификат SSL в Laravel 5 при аутентификации Facebook Ошибка синтаксического анализа строки PHP с необходимой точкой с запятой после переменной Как обрабатывать значения NULL в инструкции mysql SELECT … OUTFILE в сочетании с FIELDS ESCAPED BY? Значения NULL в настоящее время усекаются SimpleXML: выбор элементов, имеющих определенное значение атрибута Расширение PHP с помощью C ++?

оператор switch без разрыва

Почему аргумент 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 случай по умолчанию, так как его последний случай в блоке коммутатора.

Я действительно не понимаю, чего вы хотите.

  1. Если вы хотите использовать материал по умолчанию во всех случаях, просто поставьте его после переключения.
  2. Если вы хотите использовать материал по умолчанию только в «созданном» случае и в случае по умолчанию, поменяйте позицию разделов «созданный» и «создатель» и положите разрыв после первого.
  3. Если вы хотите, чтобы этот код выполнялся только при создании или создании совпадений, затем избавиться от оператора switch и использовать if / else ИЛИ использовать флаг и следующий оператор if.

Все инструменты есть.