태그 보관물: php

php

PHP에서 if 문을 어기는 방법은 무엇입니까? 모든 명령 있는가 if와 같은 문, break또는

현재 또는 부모 실행 중지 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에 설명 된대로