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


129

현재 또는 부모 실행 중지 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 년 만에 자랐고 코드를 작은 덩어리로 작성할 수있는 방법, 코드 냄새가 될 수있는 중첩 된 이유 및 관리 가능한 작은 함수를 작성하여 이러한 문제를 피하는 방법을 배웠습니다.


15
두 예제 모두 논리적으로 의미가 없습니다.
Tim Pietzcker

1
@Usman : 조건이 없으면 echo(예제에서) 절대 실행 되지 않습니다 . 따라서 삭제할 수도 있습니다.
Oliver Charlesworth

2
되지는 try catch옵션?
giannis christofakis

먼저 팀이 무례하다고 생각했지만 ... 그가 옳다고 생각했습니다. 왜 무조건적인 휴식의 코드가 있습니까? 디버깅? 나는 계속해서 for 루프를 끊는 것을 좋아합니다. "여기서 중지"명령으로 매우 어려운 쿼리를 분류하는 것이 좋을 것입니다 ...if (condition) { if ( oneothercondition ) stop; if ( yetothercondition ) stop; // go ahead , all is fine }
Joeri

@Joeri 나는 Muhhamad의 초기 아이디어가 왜 그가 휴식을 필요로했는지 모른다. 그러나 제 경우에는 이제 디버깅 목적입니다. 어떤 경우에는 시간을 절약 할 수 있습니다. 중단 점을 추가 할 수없는 경우 '(IDE를 사용하지 않거나 어떤 이유로 라이브 사이트에서 작업해야하는 경우 등)
Viktor Borítás

답변:


216

다른 사용자의 의견에 대해 걱정하지 마십시오. 이해할 수 있습니다. 이 "공상"을 개발할 때 가끔 필요합니다 . 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대안이지만, 이것에 대한 나쁜 점은 항상 레이블 (포인트 대상)을 정의해야한다는 것입니다.


29
큰! 때로는 깊은 의미로 인해 질문이 오해되기도합니다. 당신은 내가 말 추적을 피하기 위해 청소 코드가 필요, 완벽하게있어if
무하마드 우스만을

4
각 성공적인 테스트 (약 3 또는 4 테스트) 후에 동일한 코드를 실행하고 elseif실패한 각 테스트를 수행해야했습니다. 이것은 내가 찾던 것입니다. 이제 내 코드는 KISS이며 DRY를 준수합니다 :) 감사합니다!
s3v3n

3
이 사람은 더럽다! 그러나 그것은 내 공의를 얻는다. 나는 더러운 시스템에서 일하고있다;)
LeonardChallis

8
@rdlowrey, 이야기는 무료입니다, 그래서 OP 질문을 해결하기 위해 우리에게 "잘 작성 OOP"의 예를 보여주십시오 : 3
AgelessEssence

7
샘플의 요청을 개인 공격과 혼동하지 마십시오 ... 실제로 모든 코딩이 OOP가 아니어야하는 중요한 사항이 누락되었습니다. OOP의 마법 *으로 간단한 작업을 작성하는 미친 것입니다.
AgelessEssence 2016 년

98

함수에 코드를 캡슐화하십시오. return언제든지 기능 실행을 중지 할 수 있습니다 .


2
나는 함수가 아닌 if를 원했지만? ;)
Arnaud Le Blanc

3
코드가 함수에 있으면 @ arnaud576875, if 문에서 return을 사용하여 실행을 중단 할 수 있습니다.
막심 Krizhanovsky

1
기능은 "1 way in"및 "1 way out"이어야합니다. 여러 RETURNS가 느슨하고 오류가 발생하기 쉽습니다.
노인 월터

@OldManWalter 실제 데이터를 반환하는 경우에만 해당됩니다. 그러나 오류 처리는이 규칙의 일반적인 예외입니다. "1 way in, 1 way out"사고 방식이 보호하려는 일반적인 함정에 부딪치지 않으면 서 여러 장소에서 예외를 던지거나 거짓을 반환하는 것은 완벽하게 허용됩니다.
danielson317

41

이를 수행하는 올바른 방법 :

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

프로세스 리턴 값을 변수에 저장 한 다음 실패한 프로세스가 실패 / 예외 블록에서 체크인 할 수도 있습니다.


1
이 경우 예외가 유용 할 수 있지만 오용하는 것 같습니다. 정상적인 프로그램 흐름이 아닌 예외는 예외입니다. 실패가 예외적 인 경우 process_x-z는 예외를 스스로 발생시켜야합니다. clean_all_processes ()는 finally 블록에서 더 좋을 것입니다.
Jimmy T.

솔루션을 개선했습니다.
Rahul Ranjan

마지막으로 사용하지 않은 이유는 php5.5까지 지원되지 않기 때문입니다.
Rahul Ranjan

20

당신이 할 수 있기 때문에 휴식 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);

아무도 당신이 그것을 사용해야한다고 말하지 않습니다. "파괴"하는 예일뿐입니다.
Markus Zeller 2016 년

2
깔끔한 접근-일을합니다.
benjaminhull

16

고토 :

고토 연산자는 프로그램의 다른 섹션으로 이동하는 데 사용할 수 있습니다. 대상 지점은 레이블 다음에 콜론으로 지정되며 명령은 goto 다음에 원하는 대상 레이블로 지정됩니다. 이것은 완전한 무제한 goto 가 아닙니다 . 대상 레이블은 동일한 파일과 컨텍스트 내에 있어야합니다. 즉, 함수 나 메소드에서 벗어날 수 없으며 다른 것으로 이동할 수도 없습니다. 또한 루프 나 스위치 구조로 이동할 수 없습니다. 당신은 이것들로부터 뛰어 넘을 수 있으며, 일반적인 용도는 다단계 휴식 대신에 goto 를 사용하는 것입니다 ...


82
를 사용할 때마다 goto아기 예수는 새끼 고양이를 먹는다. 또한, xkcd.com/292

12
일관성을 유지해서 죄송합니다. 언급 된 키워드의 정확한 사용법을 설명하는 PHP 매뉴얼 페이지를 참조했습니다. 더러운 솔루션 일지라도 여전히 올바른 솔루션입니다.
NiematojakTomasz

3
어떻게 그렇게하는 것이 좋지 않은지 정확히 이해하지 못합니까? 다른 모든 솔루션보다 훨씬 간단합니다.
538ROMEO

1
세바스티앙과 동의 함. 경우에 따라 goto 연산자는 매우 유용하고 간단합니다.
Jerry

6
걱정하지 마십시오. 프로그래머는 항상 자신이 올바르게 코딩하고 있지 않다고 느끼게하고 코드를 코딩하기를 원할 것입니다. 우리는 힙 스터 코더이며 PHP는 이러한 자유 키워드와 모든 사람들이 어떻게 행동하는지에 대한 판단의 자유를 우리에게 제공하기 때문에 이것은 PHP 커뮤니티에서 더욱 사실입니다. 나는 goto생산 코드 에서 키워드를 광범위하게 사용하지 않았으며 결코 문제가 없었습니다.
vdegenne

7

다음과 같은 명령이 있습니다. goto

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


}



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

그러나 goto코드 형식이 비정상적으로 만들어 지므로 권장하는 방법은 아닙니다.


1
이 스크립트를 테스트했습니다. 아래 코드는 Area1입니다. 실행되지 않습니다.
레온 암스트롱


5

아니요, 루프 내부에서와 같이 if 블록을 "중단"할 방법이 없습니다. :(
따라서 테스트를 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;
  }

나에게 예외는 오류를 발생시키고 실제로 실행 결함을 제어하는 ​​것이 아닙니다.
설정하려는 중단 동작이 예기치 않은 오류에 관한 것이 아니라면 예외 처리가 올바른 해결책이 아닙니다 :/.


흥미로운 아이디어이지만 "실제"코드에는 사용하지 않을 것입니다.
Jimmy T.

1
"진짜", 무슨 소리 야? :/
Stphane

1
@Stphane 늦은 의견이지만이 상황에서 스위치를 사용하는 것은 가장 놀랍지 않은 원칙에 위배됩니다. switch 문은 프로그램 흐름을 제어하지 않고 데이터 선택을 제어해야합니다.
FWDekker

« 스위치 는 표현식을 다른 값과 비교하고 표현식이 어떤 값에 해당하는지에 따라 특정 코드 블록을 실행합니다.» 그런 다음 각 블록은 보조 흐름을 평가하여 실행 흐름이 일부 명령을 반환하거나 생략하도록 지시 할 수 있습니다 ... 나는 매우 좁은 사용 사례에서 스위치가 가장 놀랍지 않은 원칙에 어긋날 것이라고 생각하지는 않습니다. 요구 사항은 실제로 일부 리팩토링이 필요할 수 있습니다.
Stphane

4
$a = 1;

switch($a) {

  case "1":

    if  ($condition1){
      break;
    }

    if  ($condition2){
      break;
    }

    if  ($condition3){
      break;
    }
}

이런 식으로 나는 내가 원하는 것을 얻었습니다. 스위치를 사용하는 경우는 명확한 경우가 있으며 조건을 선택하기 위해 브레이크 인을 사용합니다. 내가 break : condition1과 condition2를 사용하는 이유는 condition1 만 적용됩니다 .IF는 순서에 따라 선택적입니다.


8
이를 위해 변수가 필요하지 않습니다. 그냥 사용하십시오switch(true) { case true:
Maxim Krizhanovsky

1

아니.

그러나 어떻습니까 :

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

3
감사합니다,하지만, 나는 너무 많은 피하기 위해 여기에 간단한 버전을 찾고 if문을
무하마드 우스만

2
@Usman : 여러 조건이있는 경우이를 확인해야합니다. 상태를 점검하는 것은 전통적으로 if진술과 관련이 있습니다. 어떻게 피할 것인지 잘 모르겠습니다.
Oliver Charlesworth

1

실행되지 않아야 할 코드를 else/elseif분기 로 이동하십시오 . 나는 왜 당신이하려는 일을하고 싶은지 알지 못합니다.


1

간단한 대답은 아니요, 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

0

그것이 달성 가능한지 아닌지 당신의 질문에 대답하면 php의 "goto"연산자를 사용하여 달성 할 수 있습니다.

그러나 윤리적으로 "goto"를 사용하는 것은 좋은 습관이 아니며 goto를 사용해야 할 필요가 있습니다. 이는 goto의 요구 사항을 제거 할 수 있도록 코드를 재구성해야한다는 것을 의미합니다.

위에 게시 한 샘플 코드에 따르면 코드를 재구성 할 수 있으며 더 이상 필요하지 않은 코드를 삭제하거나 주석 처리 할 수 ​​있음을 알 수 있습니다 (향후 사용 가능할 경우).


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

0

나는 당신이 이것을 찾고 있다고 생각합니다 :

if (condition) { 
    if ( oneothercondition ) continue;  
    if ( yetothercondition ) continue; 

    // go ahead , all is fine
}

PHP 매뉴얼은 for예제를 보여 주지만 , 그것은 또한 작동한다고 생각합니다if


-1

많은 변경없이 간단한 해결책이 있습니다. 초기 진술은

위의 if 문을 중단하고 echo "yes"실행을 중지하고 싶습니다. 또는 더 이상 실행될 필요가없는 추가 코드가 있거나 추가 조건이 없을 수있는 코드는이 방법이 있습니까?

간단 해 보입니다. 이와 같은 코드를 사용해보십시오.

$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";

이 코드를 사용하면 원래 문장이 완전히 존중됩니다 .. :) 더 읽기 쉽습니다!


-2

간단한 해결책은 주석 처리하는 것입니다.

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

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

추가 혜택은 원래 코드를 변경하지 않고 날짜를 정하고 초기화하여 이유를 제시 할 수 있다는 것입니다.

OP 요청에 따르면 다운 투표가 필요한 이유는 이것이 완전히 유효한 솔루션이라고 생각합니다.

"위의 if 문을 깨고 에코 실행을 중지하고 싶습니다. 더 이상 실행에 필요하지 않은 추가 코드가 있거나 추가 조건이 있거나 없을 수있는 코드는이 방법이 있습니까?"

실제로 누군가 1 년 후의 다른 솔루션 중 일부를보고 무슨 일이 일어나고 있는지 궁금해 할 수 있습니다. 내 제안에 따라 나중에 참조 할 수있는 좋은 문서를 남길 수 있으며 이는 항상 좋은 습관입니다.


2
이렇게해도 문제가 해결되지 않습니다. 휴식도 if에있을 수 있습니다.
Jimmy T.

if 문에 주석을 달 수 없습니까? 아니면 의견 하나? 실행을 제외하려면 if를 사용 하시겠습니까? 그렇다면 휴식의 요점은 무엇입니까, 그렇다면 if 문은 무엇입니까? 그냥 의견을 말하십시오. 미안하지만 요점이 보이지 않습니다.
ArtisticPhoenix

이와 같은 것 : a : if ( "test"== $ a) {... if (...) break a; ...}
Jimmy T.

-3

삼항 연산자를 사용하는 것은 어떻습니까?

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

PHP7에서 :$a = $_POST['action'] ?? 'default';
Tobias Mühl

-3

나머지 스크립트 실행을 완전히 중지하려면 다음을 수행하십시오.

출구; // 휴식 대신. 나머지 코드는 실행되지 않습니다


-4

나는 파티에 늦었지만 기여하고 싶었다. 아무도 제안하지 않은 것에 놀랐습니다 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!

-7
$a="test";
if("test"!=$a)
{
echo "yes";                   
}
 else
 {
  echo "finish";
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.