[php] PHP에서 if 문을 어기는 방법은 무엇입니까?

현재 또는 부모 실행 중지 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";

breakif진술을 원하고 실행을 중지 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에 설명 된대로