현재 또는 부모 실행 중지 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";
하거나 더 이상 실행에 필요하지 않은 코드를 추가 조건이 있거나 없을 수 있습니다.이 방법이 있습니까?
업데이트 : 이 질문을 게시 한 지 2 년 만에 자랐고 코드를 작은 덩어리로 작성할 수있는 방법, 코드 냄새가 될 수있는 중첩 된 이유 및 관리 가능한 작은 함수를 작성하여 이러한 문제를 피하는 방법을 배웠습니다.
답변
다른 사용자의 의견에 대해 걱정하지 마십시오. 이해할 수 있습니다. 이 “공상”을 개발할 때 가끔 필요합니다 . if를 깨뜨릴 수 있다면, 중첩 된 if가 많이 필요하지 않으므로 코드가 훨씬 깨끗하고 심미적입니다.
이 샘플 코드는 설명 추한 중첩 된 IFS를 많이보다 훨씬 더 적합 할 수 있다면 … breaked 그 CERTAINS 상황을 특정 상황이 존재하지 않는 것을 의미하지 않음을 직면하지 않은 경우 .
못생긴 코드
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();
}
일부 의견을 읽은 후 예외 처리가 항상 정상적인 흐름 제어에 적합하지 않다는 것을 깨달았습니다. 정상적인 제어 흐름의 경우 “다른 경우”를 사용하는 것이 좋습니다.
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();
}
프로세스 리턴 값을 변수에 저장 한 다음 실패한 프로세스가 실패 / 예외 블록에서 체크인 할 수도 있습니다.
답변
당신이 할 수 있기 때문에 휴식 DO가 밖으로 / 루프 동안, 우리가 “하자 할 한 라운드를”. A를 잠시 (false)를 마지막에, 조건이 true 결코 다시 반복되지 않습니다.
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);
답변
고토 :
고토 연산자는 프로그램의 다른 섹션으로 이동하는 데 사용할 수 있습니다. 대상 지점은 레이블 다음에 콜론으로 지정되며 명령은 goto 다음에 원하는 대상 레이블로 지정됩니다. 이것은 완전한 무제한 goto 가 아닙니다 . 대상 레이블은 동일한 파일과 컨텍스트 내에 있어야합니다. 즉, 함수 나 메소드에서 벗어날 수 없으며 다른 것으로 이동할 수도 없습니다. 또한 루프 나 스위치 구조로 이동할 수 없습니다. 당신은 이것들로부터 뛰어 넘을 수 있으며, 일반적인 용도는 다단계 휴식 대신에 goto 를 사용하는 것입니다 …
답변
다음과 같은 명령이 있습니다. goto
if(smth) {
.....
.....
.....
.....
.....
goto Area1;
.....
.....
}
Area1:
....your code here....
그러나 goto
코드 형식이 비정상적으로 만들어 지므로 권장하는 방법은 아닙니다.
답변
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에 설명 된대로