2014-12-19 4 views
0

Есть ли способ разбить if заявление как while?Есть ли способ разбить оператор, например, как

while(true) { 
    break; 
} 

if(true) { 
    //break if 
} else { 
    //continue execution here or miss if at all 
} 
+2

Вы искали ** продолжение; **? – donald123

+0

Гнездо другое 'if'? – Sonny

+2

Я не уверен, что вы просите. Вы хотите, чтобы выполнение переключилось на начало блока 'else'? Вы всегда можете использовать '' goto' '(http://php.net/manual/en/control-structures.goto.php) (и обратите внимание, что 'break' и' continue' являются только специализированными формами 'goto'), но в 99% случаев, есть лучший способ. –

ответ

0

Да, с помощью goto. Используйте это с осторожностью, так как это, как правило, указывает на неправильные привычки кода в других местах. У этого есть законное использование, хотя (например, вырваться из вложенных циклов).

http://php.net/manual/en/control-structures.goto.php

Я думаю, что ваш вопрос плохо сформулирован. Я думаю, что это проблема у вас возникли:

if(foo) { 
    if(bar) { 
     baz(); 
    } else { 
     qux(); 
    } 
} else { 
    qux(); 
} 

Вы хотите упростить это так, что qux() нужно быть выражены только один раз, а не два раза. Возможное решение с использованием goto существует:

if(foo) { 
    if(bar) { 
     baz(); 
    } else { 
     goto quxLabel; 
    } 
} else { 
    quxLabel: 
    qux(); 
} 

Это работает, но я думаю, что лучшее решение (если это возможно в вашем случае), чтобы составить ваши условия ветвления. Это требует, чтобы вы были в состоянии оценить bar независимо от foo, так что я не знаю, если это применимо в вашем случае:

if(foo && bar) baz(); 
else    qux(); 

Если bar зависит от foo, то вы можете использовать эту технику, но воспользоваться поведение короткого замыкания оператора &&:

if(foo && computeBar(foo)) baz(); 
else       qux(); 
+0

Я знаю, что использование закладок не является хорошим стилем кодирования, но может быть единственным способом сделать это. –

-2
if(true){ 
    goto end; 
    } 
    else { 
    continue execution here or miss if at all 
    } 
    end: 
    /* your statement*/ 
+0

вы хотите попробовать exit() function –

+0

'exit()' завершает _all_ будущего исполнения. Это не похоже на то, о чем просят. –

+0

попробуйте метод возврата –

-2
try { 
    if (...) { 
     do_something(); 
     ... 
     throw new \Exception(); // Break here 
     ... 
    } 
} catch (\Exception $e) {} 

// Resumes here: 
do_something_now() 

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

+1

Это может быть правильно, если возникает необработанное условие, но это не обычный случай для выхода из структуры цикла. – SaschaM78

+0

Нет, но разрыв условностей не является обычным случаем хе. Тем не менее, если вы имеете дело с глубоко вложенными циклами (что само по себе является запахом кода), использование исключений для управления потоком данных, когда что-то неожиданное происходит, вероятно, лучший способ сделать это (конечно, лучше, чем разбить несколько уровней, т.е. 3; '). – AlpineCoder

+0

Вы правы, если мы говорим о выходе из программы во время выполнения неожиданного условия (например, в вашем примере), но это не обязательно верно в отношении операторов цикла (т. Е. Представьте себе цикл коллекции до тех пор, пока не будет найден конкретный элемент). – SaschaM78

0

Просто, инвертировать порядок и использовать !:

<?php 
if(!true){ 
echo "execution here or miss if at all"; 
} else { 
echo "Nothing"; 
} 

Смотреть это DEMO: http://codepad.org/XdFKfY9R

0

if -statement используется для ветвления кода без повторения, поэтому нет никакой необходимости в break конструктора. Это другое дело, когда вы используете loop операторы управления, особенно без определенного контура заявления условия, как:

while (1==1) { 
    ... 
} 

Чтобы избежать зацикливания, нужно будет объединить филиалы и петли заявления, возможно, это была идея вашего вопрос:

while (1==1) { 

    // do stuff 
    ... 

    // special condition 
    if ($cancel) { 
    break; 
    } 
} 
Смежные вопросы