문제

PHP가 "goto" 명령을 도입할 계획이라는 소문을 들었습니다.무엇을 하고 있는 걸까요?

조금 검색해 보았지만, 끔찍하게 설명적인 내용은 찾지 못했습니다.나는 그것이 "가 아닐 것이라는 것을 이해합니다.GOTO 10"-같은 명령...

도움이 되었습니까?

해결책

실제 GOTO를 추가하는 것이 아니라 정적 레이블을 사용하도록 BREAK 키워드를 확장하는 것입니다.기본적으로 탈옥 능력이 강화됩니다. 스위치 중첩된 if 문.내가 찾은 개념 예는 다음과 같습니다.

<?php
for ($i = 0; $i < 9; $i++) {
    if (true) {
        break blah;
    }
    echo "not shown";
    blah:
    echo "iteration $i\n";
}
?>

물론, 일단 GOTO "루머"가 터지면 일부 사악한 사람들이 추가로 전파하는 것을 막을 수는 없었습니다. COMEFROM 농담.긴장하세요.

또한보십시오:

http://www.php.net/~derick/meeting-notes.html#adding-goto

다른 팁

나는 PHP 디자이너들이 얼마나 믿을 수 없을 만큼 멍청한지 항상 놀란다.gotos를 사용하는 목적이 곱하기 중첩 루프에서 나누는 것이 더 효율적이라면 더 나은 방법이 있습니다.레이블을 참조 할 수있는 라벨이 붙은 코드 블록 및 브레이크 명령문 :

a:  for (...) {
    b:  for (...) {
         c: for (...) {
               ...
               break a;
           }
       }
   }

이제 어떤 루프/블록을 종료해야 하는지 명확하고 종료가 구조화되었습니다.실제 goto를 사용하는 것처럼 스파게티 코드를 얻을 수 없습니다.

이것은 오래되고, 낡고, 오래된 생각입니다.우수한 제어 흐름 관리 구조를 설계하는 것은 70 년대부터 해결되었으며,이 모든 것에 대한 문헌은 쓰여진 이후로 오래되었습니다.Bohm-Jacopini 정리는 기능 호출, if-then-else 및 루프로 무엇이든 코딩 할 수 있음을 보여주었습니다.실제로, 깊게 중첩 된 블록에서 벗어나려면 Bohm-Jacopini 스타일 코딩은 추가로 부울 깃발 ( "루프에서 나가기 위해이 깃발을 설정하십시오")은 현명하고 비효율적이었던 서투른 코딩 (당신은 귀하의 그러한 플래그를 원하지 않습니다. 내부 루프).if-then-else, 다양한 루프 (whind, for) 및 분리 된 블록을 사용하면 효율이 손실되지 않고 모든 알고리즘을 코딩 할 수 있습니다.사람들은 왜 C가 한 일을 복사하는 대신 문헌을 읽지 않습니까?으르렁.

물론 저는 PHP 프로그래머가 아니며 PHP의 GOTO 구현이 정확히 어떤 모습인지는 모르지만 GOTO에 대한 저의 이해는 다음과 같습니다.

GOTO는 다른 명령문과 마찬가지로 보다 명시적인 흐름 제어 명령문입니다.중첩된 루프가 있고 하나만 찾으면 된다고 가정해 보겠습니다.조건문(또는 여러 개)을 넣을 수 있으며 조건이 적절하게 충족되면 GOTO 문을 사용하여 모든 루프에서 벗어날 수 있습니다(조건문과 함께 각 중첩 수준에서 'break' 문을 사용하는 대신). 각각.그리고 그렇습니다. 전통적인 구현은 GOTO 문이 이름별로 이동할 수 있는 레이블을 지정하는 것이라고 생각합니다.다음과 같이 할 수 있습니다:

for(...) {
    for (...) {
        for (...) {
        // some code
        if (x) GOTO outside;
        }
    }
} 
:outside

이는 GOTO 문을 사용하지 않는 것보다 더 간단하고 효율적인 구현입니다.이에 상응하는 내용은 다음과 같습니다.

for(...) {
    for (...) {
        for (...) {
            // some code
            if (x) break;
        }
        if(x) break;
    }
    if(x) break;
} 

두 번째 경우(일반적인 관행)에는 세 개의 조건문이 있는데, 이는 하나만 갖는 것보다 확실히 느립니다.따라서 최적화/단순화를 위해 밀접하게 중첩된 루프에서 GOTO 문을 사용할 수 있습니다.

주어진 예에서 스티브스45 대신 함수를 사용할 수 있습니다.

function findItem(...) {
  for (...) {
    for (...) {
      for (...) {
        if (x) {
          return theItem;
        }
      }
    }
  }
}

// no need for label now
theItem = findItem(a, b, c);

그것 외모 현재 PHP 5.3에 있는 것과 같지만 아직 완전히 문서화되지 않았습니다.내가 알 수 있듯이 C와 goto 구문을 공유하므로 선택하고 사용하기가 쉬울 것입니다.Dijkstra의 말을 기억하세요 경고 그리고 필요한 경우에만 사용하세요.

@steveth45

내 규칙은 코드가 3 레벨 이상 중첩 된 경우 뭔가 잘못하고 있다는 것입니다.

그러면 여러 개의 break 문을 사용하거나 goto를 사용하는 것에 대해 걱정할 필요가 없습니다. :D

~이있다 goto PHP에서 -> http://php.net/manual/en/control-structures.goto.php, 하지만 저는 그것을 사용하지 않고 그냥 일반 코드를 작성합니다...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top