Любой способ разбить оператор на PHP?

Есть ли какая-либо команда в 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"; или таких кодов, которые больше не нужны для выполнения, может быть или не быть дополнительным условием, существует ли способ сделать это

Ответ 1

Не беспокойтесь о комментариях других пользователей, я могу понять вас, ИНОГДА при разработке этого "причудливого" вещания требуется. Если мы можем сломать if, много вложенных ifs не понадобится, делая код намного более чистым и эстетичным.

Этот пример кода иллюстрирует, который определяет условия, где breaked if может быть намного более подходящим, чем много уродливых вложенных ifs... если вы не сталкивались с этой ситуацией, это не значит, t существует.

Уродливый код

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 является альтернативой, плохой об этом - вам всегда нужно определить метку (целевую точку).

Ответ 2

Инкапсулируйте свой код в функцию. Вы можете прекратить выполнение функции с помощью return в любое время.

Ответ 3

правильный способ сделать это:

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();
}

Вы также можете сохранить возвращаемые значения процесса в переменных, а затем проверить блоки ошибок/исключений, процесс которых завершился неудачно.

Ответ 4

Перейти к:

Оператор goto может использоваться для перехода к другому разделу программы. Целевая точка указывается меткой, за которой следует двоеточие, а инструкция - как goto, за которой следует нужная метка цели. Это не полный неограниченный гото. Целевая метка должна находиться в том же файле и контексте, что означает, что вы не можете выпрыгнуть из функции или метода, а также не можете перейти в одну. Вы также не можете прыгнуть в какой-либо цикл или переключить структуру. Вы можете выпрыгнуть из них, и обычным делом является использование goto вместо многоуровневого перерыва...

Ответ 5

Поскольку вы можете сломать из цикла do/while, давайте сделать один раунд. В конце 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);

Ответ 6

используйте команду GOTO.

if(smth) {
   .....
   .....
   .....
   .....
   .....
   goto Area1;
   .....
   .....


}



Area1:
....your code here....

Тем не менее, помните, что goto не рекомендуется, потому что код делает форматирование необычным.

Ответ 7

Вы можете использовать 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

Ответ 8

Нет, нет возможности "сломать" блок 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;
  }

Для меня Исключения предназначены для повышения ошибок и не для того, чтобы контролировать недостатки выполнения.
Если поведение прерывания, которое вы пытаетесь установить, не связано с непредвиденной ошибкой (ошибками), обработка исключений не является правильным решением здесь :/.

Ответ 9

$a = 1;

switch($a) {

  case "1":

    if  ($condition1){
      break;
    }

    if  ($condition2){
      break;
    }

    if  ($condition3){
      break;
    }
}

Таким образом, я получил то, что хочу. Я использую переключатель только в определенном случае, а затем использую break в случае выбора условия. Причина, по которой я использую break: condition1 и condition2, может удовлетворять, так как в этой ситуации применяется только условие1. Если выборочно в соответствии с порядком.

Ответ 10

Нет.

Но как насчет:

$a="test";
if("test"==$a)
{
  if ($someOtherCondition)
  {
    echo "yes";
  }
}
echo "finish";

Ответ 11

Просто переместите код, который не должен выполняться в ветки else/elseif. Я действительно не понимаю, почему вы хотите делать то, что вы пытаетесь сделать.

Ответ 12

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

Ответ 13

Отвечая на ваш вопрос о том, достижимо ли это или нет, тогда да, что можно достичь, используя оператор "goto" php.

Но с этической точки зрения, это не очень хорошая практика для использования "goto", и есть необходимость использовать goto, тогда это означает, что код необходимо восстановить, так что требование goto может быть удалено.

В соответствии с приведенным выше образцом кода, можно четко видеть, что код может быть восстановлен, а код, который больше не требуется, может быть удален или прокомментирован (если возможности для использования в будущем).

Ответ 14

$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();

Ответ 15

У меня есть простое решение без большого количества изменений. начальная инструкция

Я хочу разбить оператор 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";

с этим кодом, исходное утверждение полностью соблюдается..:) и более читаемым!

Ответ 16

Вы можете использовать выражение "умереть", например,

<?php
if (condition)
{
statements;
die;
}
?>

Ответ 17

Простое решение - прокомментировать это.

$a="test";
if("test"==$a)
{

  //echo "yes"; //no longer needed - 7/7/2014 - updateded bla bla to do foo
}

Дополнительным преимуществом является то, что вы не изменяете свой исходный код, и вы можете встретить его, указать его и указать причину.

Почему голосующий голос, согласно запросу OP, я считаю, что это абсолютно правильное решение.

"Я хочу [нарушить оператор if выше и] прекратить выполнение эха" да "или такие коды, которые больше не нужны для выполнения, может быть или не быть дополнительным условием, есть ли способ сделать это?"

На самом деле кто-то может взглянуть на некоторые другие решения, последние год и удивляться, что там происходит. Согласно моему предложению, можно оставить хорошую документацию для дальнейшего использования, что всегда является хорошей практикой.

Ответ 18

Чтобы полностью остановить оставшуюся часть script, вы можете просто сделать

выход;//Вместо перерыва. Остальная часть кода не будет выполняться

Ответ 19

Я опаздываю на вечеринку, но я хотел бы внести свой вклад. Я удивлен, что никто не предложил 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!

Ответ 20

Как насчет использования тернарного оператора?

<?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'];
 }
?>

Ответ 21

$a="test";
if("test"!=$a)
{
echo "yes";                   
}
 else
 {
  echo "finish";
}