Есть ли какая-либо команда в PHP, чтобы остановить выполнение текущего или родительского оператора if
, так же, как break
или break(1)
для switch
/ loop
. Например
$arr=array('a','b'); foreach($arr as $val) { break; echo "test"; } echo "finish";
в вышеприведенном коде PHP не будет выполнять echo "test";
и пойдет в echo "finish";
Мне нужно это, если
$a="test"; if("test"==$a) { break; echo "yes"; // I don't want this line or lines after to be executed, without using another if } echo "finish";
Я хочу break
вышеприведенное утверждение if
и прекратить выполнение echo "yes";
или такие коды, которые больше не требуются для выполнения, может быть или не быть дополнительным условием, существует ли способ сделать это?
Не беспокойтесь о других комментариях пользователей, я могу понять вас, ИНОГДА, когда разрабатываются эти «причудливые» вещи . Если мы можем сломать if, много вложенных ifs не понадобится, делая код намного более чистым и эстетичным.
Этот пример кода иллюстрирует, что CERTAINS SITUATIONS, где breaked if может быть намного более подходящим, чем много уродливых вложенных ifs … если вы не сталкивались с такой ситуацией, это не значит, что она не существует .
Уродливый код
if(process_x()) { /* do a lot of other things */ if(process_y()) { /* do a lot of other things */ if(process_z()) { /* do a lot of other things */ /* SUCCESS */ } else { clean_all_processes(); } } else { clean_all_processes(); } } else { clean_all_processes(); }
Хороший код
do { if( !process_x() ) { clean_all_processes(); break; } /* do a lot of other things */ if( !process_y() ) { clean_all_processes(); break; } /* do a lot of other things */ if( !process_z() ) { clean_all_processes(); break; } /* do a lot of other things */ /* SUCCESS */ } while (0);
Как говорит @NiematojakTomasz, использование goto
является альтернативой, плохая вещь об этом – вам всегда нужно определить метку (целевая точка).
Инкапсулируйте свой код в функцию. Вы можете прекратить выполнение функции с return
в любое время.
правильный способ сделать это:
try{ if( !process_x() ){ throw new Exception('process_x failed'); } /* do a lot of other things */ if( !process_y() ){ throw new Exception('process_y failed'); } /* do a lot of other things */ if( !process_z() ){ throw new Exception('process_z failed'); } /* do a lot of other things */ /* SUCCESS */ }catch(Exception $ex){ clean_all_processes(); }
После прочтения некоторых комментариев я понял, что обработка исключений не всегда имеет смысл для нормального управления потоком. Для нормального потока управления лучше использовать «If else»:
try{ if( process_x() && process_y() && process_z() ) { // all processes successful // do something } else { //one of the processes failed clean_all_processes(); } }catch(Exception ex){ // one of the processes raised an exception clean_all_processes(); }
Вы также можете сохранить возвращаемые значения процесса в переменных, а затем проверить блоки ошибок / исключений, процесс которых завершился неудачно.
goto :
Оператор goto может использоваться для перехода в другой раздел программы. Целевая точка указывается меткой, за которой следует двоеточие, и инструкция указывается как goto, за которой следует желаемая целевая метка. Это не полный неограниченный переход . Метка-мишень должна быть в том же файле и контексте, что означает, что вы не можете выпрыгнуть из функции или метода и не можете перейти в одну. Вы также не можете переходить в какую-либо петлю или структуру коммутатора. Вы можете выпрыгнуть из них, и распространенное использование – использовать goto вместо многоуровневого перерыва …
Поскольку вы можете выйти из цикла do / while, давайте « сделаем » один раунд. Через некоторое время (false) в конце условие никогда не будет истинным и не повторится снова.
do { $subjectText = trim(filter_input(INPUT_POST, 'subject')); if(!$subjectText) { $smallInfo = 'Please give a subject.'; break; } $messageText = trim(filter_input(INPUT_POST, 'message')); if(!$messageText) { $smallInfo = 'Please supply a message.'; break; } } while(false);
Вы можете использовать do-while (false):
<?php do if ($foo) { // Do something first... // Shall we continue with this block, or exit now? if ($abort_if_block) break; // Continue doing something... } while (false); ?>
как описано в http://php.net/manual/en/control-structures.if.php#90073
Нет, нет возможности «сломать» блок if, как и внутренние циклы. :(
Поэтому включите ваш тест в switch
!
Интересно, почему никто не призывал вас использовать оператор switch с тех пор (даже если у вас не так много тестов)
Считаете ли вы, что это слишком многословно?
Я бы определенно пошел на это здесь
switch($a){ case 'test': # do stuff here ... if(/* Reason why you may break */){ break; # this will prevent executing "echo 'yes';" statement } echo 'yes'; # ... break; # As one may already know, we might always have to break at the end of case to prevent executing following cases instructions. # default: # something else here .. # break; }
Для меня Исключения предназначены для повышения ошибок и не для того, чтобы контролировать недостатки выполнения.
Если поведение прерывания, которое вы пытаетесь установить, не связано с непредвиденной ошибкой (ошибками), обработка исключений не является правильным решением здесь :/
.
Я сталкиваюсь с одной и той же проблемой, и мне нравится ниже:
$a=1; switch($a) { case "1": if ($coniditon1){ break; } if ($coniditon2){ break; } if ($coniditon3){ break; } }
Таким образом я получил то, что хочу. Я использую переключатель только имеет определенный случай, а затем используйте break в случае, чтобы выбрать условие. Причина, по которой я использую break: condition1 и conditon2, может удовлетворять, в этой ситуации применяется только условие 1. .IF является выборочным в соответствии с порядком.
Просто переместите код, который не должен выполняться в else/elseif
. Я действительно не понимаю, почему вы хотите делать то, что вы пытаетесь сделать.
GOTO
if(smth) { ..... ..... ..... ..... ..... goto Area1; ..... ..... } Area1: ....your code here....
Простой ответ заключается в том, что нет, нет способа выйти из оператора if
без полной остановки выполнения (через exit
). Другие решения не будут работать для меня, потому что я не могу изменить структуру оператора if
, поскольку я вставляю код в плагин, например:
if ( condition ) { // Code and variables I want to use // Code I have control over // Code I don't want to run } // More code I want to use
Нет.
Но как насчет:
$a="test"; if("test"==$a) { if ($someOtherCondition) { echo "yes"; } } echo "finish";
Отвечая на ваш вопрос о том, достижимо ли это или нет, тогда да, что можно достичь, используя оператор «goto» php.
Но этически это не очень хорошая практика использования «goto», и есть необходимость использовать goto, тогда это означает, что код необходимо восстановить, так что требование goto может быть удалено.
Согласно приведенному выше образцу кода, можно четко видеть, что код может быть восстановлен, а код, который больше не требуется, может быть удален или прокомментировать (если в будущем это возможно для использования).
$arr=array('test','go for it'); $a='test'; foreach($arr as $val){ $output = 'test'; if($val === $a) $output = ""; echo $output; } echo "finish";
сочетая ваши заявления, я думаю, что это даст вам ваш желаемый результат. чистым и простым, без слишком больших заявлений.
для уродливого и хорошо выглядящего кода моя рекомандация будет:
function myfunction(){ if( !process_x() || !process_y() || !process_z()) { clean_all_processes(); return; } /*do all the stuff you need to do*/ }
где-то в вашем обычном коде
myfunction();
У меня есть простое решение без большого количества изменений. исходное утверждение
Я хочу сломать вышеприведенное утверждение if и прекратить выполнение эха «да»; или такие коды, которые больше не требуются для выполнения, может быть или не быть дополнительным условием, существует ли способ сделать это?
так что это кажется простым. попробуйте код вроде этого.
$a="test"; if("test"==$a) { if (1==0){ echo "yes"; // this line while never be executed. // and can be reexecuted simply by changing if (1==0) to if (1==1) } } echo "finish";
если вы хотите попробовать без этого кода, это просто. и вы можете вернуться, когда захотите. другим решением являются блоки комментариев. или просто думать и пробовать в другом разделенном коде и копировать вставить только результат в ваш окончательный код. и если код больше не нужен, в вашем случае результат может быть
$a="test"; echo "finish";
с этим кодом, оригинальное заявление полностью соблюдается .. 🙂 и более читабельным!
Я опаздываю на вечеринку, но я хотел внести свой вклад. Я удивлен, что никто не предложил exit()
. Это хорошо для тестирования. Я использую его все время и работает как шарм.
$a =''; $b =''; if($a == $b){ echo 'Clark Kent is Superman'; exit(); echo 'Clark Kent was never Superman'; }
Код будет остановлен при exit()
и все после этого не будет запущено.
результат
Clark Kent is Superman
Он работает с foreach()
и while()
. Он работает везде, где вы его размещаете.
foreach($arr as $val) { exit(); echo "test"; } echo "finish";
результат
nothing gets printed here.
Используйте его с forloop()
for ($x = 2; $x < 12; $x++) { echo "Gru has $x minions <br>"; if($x == 4){ exit(); } }
результат
Gru has 2 minions Gru has 3 minions Gru has 4 minions
В нормальном сценарии
$a ='Make hot chocolate great again!'; echo $a; exit(); $b = 'I eat chocolate and make Charlie at the Factory pay for it.';
результат
Make hot chocolate great again!
Простое решение – прокомментировать это.
$a="test"; if("test"==$a) { //echo "yes"; //no longer needed - 7/7/2014 - updateded bla bla to do foo }
Дополнительным преимуществом является то, что вы не изменяете свой исходный код, и вы можете его встретить, исправить и объяснить причину.
Почему голосующий голос, согласно просьбе OP, я считаю, что это абсолютно правильное решение.
«Я хочу [нарушить оператор if выше и] прекратить выполнение эха« да »или такие коды, которые больше не нужны для выполнения, может быть или не быть дополнительным условием, есть ли способ сделать это?»
На самом деле кто-то может взглянуть на некоторые другие решения, последние год и удивляться, что там происходит. Согласно моему предложению, можно оставить хорошую документацию для дальнейшего использования, что всегда является хорошей практикой.
Чтобы полностью остановить остальную часть скрипта, вы можете просто сделать
Выход; // Вместо перерыва. Остальная часть кода не будет выполняться
Как насчет использования тройного оператора?
<?php // Example usage for: Ternary Operator $action = (empty($_POST['action'])) ? 'default' : $_POST['action']; ?>
Что идентично этому утверждению if / else:
<?php if (empty($_POST['action'])) { $action = 'default'; } else { $action = $_POST['action']; } ?>
$a="test"; if("test"!=$a) { echo "yes"; } else { echo "finish"; }