누락 {
또는 }
잘못된 들여 쓰기 때문에
일치하지 않는 코드 괄호는 다음과 같이 형식이 잘못된 코드에 일반적입니다.
if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
코드가 다음과 같으면 새로 시작하십시오! 그렇지 않으면 그것은 당신이나 다른 사람에게 고칠 수 없습니다. 인터넷에 도움을 요청하기 위해 이것을 보여줄 필요는 없습니다.
중첩 된 구조와 if / else 조건부 및 해당 {
코드 블록의 관계를 시각적으로 따를 수있는 경우에만 수정할 수 있습니다 }
. IDE를 사용하여 모두 페어링되어 있는지 확인하십시오.
if (true) {
if (false) {
…
}
elseif ($whatever) {
if ($something2) {
…
}
else {
…
}
}
else {
…
}
if (false) { // a second `if` tree
…
}
else {
…
}
}
elseif (false) {
…
}
모든 double }
}
은 분기를 닫을뿐만 아니라 이전 조건 구조를 닫습니다. 따라서 하나의 코딩 스타일을 고수하십시오. 중첩 된 if / else 트리에서 혼합하여 일치시키지 마십시오.
여기서의 일관성 외에도 긴 조건을 피하는 것이 도움이됩니다. 읽을 수없는 if
표현식 을 피하려면 임시 변수 또는 함수를 사용하십시오 .
IF
표현식에 사용할 수 없습니다
놀랍게도 자주 if
오는 새로운 실수는 print 서술문과 같은 표현에서 서술문 을 사용하려고 합니다.
⇓
echo "<a href='" . if ($link == "example.org") { echo …
물론 유효하지 않습니다.
삼항 조건을 사용할 수 있지만 가독성에주의하십시오.
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
그렇지 않으면 이러한 출력 구성을 분리하십시오. 여러 if
s 및 echo
s를 사용하십시오 .
더 좋은 방법은 임시 변수를 사용 하고 다음과 같은 조건을 조건부 앞에 배치하는 것입니다.
if ($link) { $href = "yes"; } else { $href = "no"; }
echo "<a href='$href'>Link</a>";
그러한 경우에 함수 나 메소드를 정의하는 것도 종종 의미가 있습니다.
제어 블록은 "결과"를 반환하지 않습니다
이제는 일반적이지 않지만 일부 코더 if
는 결과를 반환 할 수있는 것처럼 취급하려고합니다 .
$var = if ($x == $y) { "true" };
if
문자열 연결 / 표현식 내 에서 사용 하는 것과 구조적으로 동일합니다 .
- 그러나 제어 구조 (if / foreach / while)에는 "결과" 가 없습니다 .
- 리터럴 문자열 "true"도 void 문일뿐입니다.
코드 블록에서 할당을 사용해야합니다 .
if ($x == $y) { $var = "true"; }
또는 ?:
삼항 비교에 의지하십시오 .
만약에 만약에
당신은 할 수 없습니다 둥지if
중 하나의 조건 내에서 :
⇓
if ($x == true and (if $y != false)) { ... }
and
(또는 or
)는 이미 체인 비교를 허용 하기 때문에 분명히 중복 됩니다.
잊혀진 ;
세미콜론
한 번 더 : 각 제어 블록은 명령문이어야합니다. 이전 코드 조각이 세미콜론으로 끝나지 않으면 구문 오류가 보장됩니다.
⇓
$var = 1 + 2 + 3
if (true) { … }
Btw, {…}
코드 블록 의 마지막 줄 에는 세미콜론도 필요합니다.
세미콜론이 너무 일찍
이 함정을 간과하기가 쉽지 않기 때문에 특정 코딩 스타일을 비난하는 것은 아마도 잘못된 것입니다.
⇓
if ($x == 5);
{
$y = 7;
}
else ←
{
$x = -1;
}
생각보다 자주 발생합니다.
- 표현식 을 종료하면
if ()
;
void 문이 실행됩니다. 는 ;
빈되고 {}
자신의!
- 따라서
{…}
블록은에서 분리되어 if
항상 실행됩니다.
- 따라서
else
더 이상 개방 if
구조와 관련이 없으므로 예기치 않은 T_ELSE 구문 오류가 발생합니다.
이 구문 오류의 미묘한 변형도 설명합니다.
if ($x) { x_is_true(); }; else { something_else(); };
어디 ;
코드 후 블록은 {…}
전체 종료 if
, 절단, 구조를 else
구문 지점을.
코드 블록을 사용하지 않음
구문 중괄호를 생략 할 수있어 {
... }
코드 블록에 대한 if
/ elseif
/ else
분기합니다. 슬프게도 비 유행 코더에게 공통적 인 구문 스타일은 무엇입니까? (잘못된 가정 하에서 입력하거나 읽는 것이 더 빠릅니다).
그러나 그것은 구문을 넘어 뜨릴 가능성이 높습니다. 조만간 추가 진술은 if / else 분기로 향할 것입니다.
if (true)
$x = 5;
elseif (false)
$x = 6;
$y = 7; ←
else
$z = 0;
실제로 코드 블록을 사용하려면, 당신은 해야합니까 쓰기에 {
... }
같은 그들!
노련한 프로그래머조차도이 중괄호없는 구문을 피하거나 최소한 예외적 인 예외로 이해해야합니다.
잘못된 순서로 Else / Elseif
자신을 생각 나게하는 것은 물론 조건적인 순서 입니다.
if ($a) { … }
else { … }
elseif ($b) { … }
↑
elseif
원하는만큼을 가질 수 있지만 else
마지막으로 가야 합니다. 그것이 바로 그 방법입니다.
클래스 선언
마찬가지로 위에서 언급 한 , 당신은 클래스 선언에서 제어 명령을 가질 수 없습니다 :
class xyz {
if (true) {
function ($var) {}
}
함수 정의 를 잊었 거나 }
그러한 경우 너무 일찍 닫았습니다 .
예기치 않은 T_ELSEIF / T_ELSE
PHP와 HTML을 혼합하는 경우, 폐쇄 }
에 대한이 if/elseif
같은 PHP 블록에 있어야합니다 <?php ?>
다음과 같은 elseif/else
. 이것에 대한 종결 }
은 다음의 if
일부가 될 때 오류가 발생 합니다 elseif
.
<?php if ($x) { ?>
html
<?php } ?>
<?php elseif ($y) { ?>
html
<?php } ?>
올바른 양식 <?php } elseif
:
<?php if ($x) { ?>
html
<?php } elseif ($y) { ?>
html
<?php } ?>
이것은 부정확 한 들여 쓰기의 변형입니다 – 아마도 종종 잘못된 코딩 의도에 근거합니다. 토큰 과 / 토큰 사이에 다른 문장을 매시
할 수 없습니다 : if
elseif
else
if (true) {
}
echo "in between"; ←
elseif (false) {
}
?> text <?php ←
else {
}
{…}
제어 구조 토큰 사이가 아닌 코드 블록 에서만 발생할 수 있습니다 .
- 어쨌든 이것은 의미가 없습니다. PHP가 분기
if
와 else
분기 사이를 이동할 때 "정의되지 않은"상태가있는 것은 아닙니다 .
- 인쇄 문이 어디에 있는지 또는 두 분기에서 반복해야 하는지를 염두에 두어야합니다.
다른 제어 구조 사이에 if / else를 나눌 수도 없습니다 .
foreach ($array as $i) {
if ($i) { … }
}
else { … }
더 없다 통 사적 관계 사이 if
및 else
. foreach
에서 어휘 범위의 끝 }
, 그래서에 대한 포인트가 없습니다 if
구조를 계속합니다.
T_ENDIF
예기치 않은 T_ENDIF에 대해 불만이있는 경우 대체 구문 스타일 if:
⋯ elseif:
⋯ else:
⋯을 사용하고 endif;
있습니다. 정말 두 번 생각해야합니다.
일반적인 함정은 세미콜론에 대한 엄청나게 비슷한 :
결장을;
혼동하고 있습니다. ( "세미콜론이 너무 빠르다"
들여 쓰기는 템플릿 파일에서 추적하기가 더 어려우므로 대체 구문을 사용할 때 더 많이 endif;
일치합니다 if:
.
사용 } endif;
은 이중 if
종결 자입니다.
"예기치 못한 $ end"는 일반적으로 잊혀진 닫는 }
중괄호 의 가격입니다 .
과제와 비교
따라서 이것은 구문 오류가 아니지만이 맥락에서 언급 할 가치가 있습니다.
⇓
if ($x = true) { }
else { do_false(); }
그것은 ==
/ ===
비교가 아니라 =
할당 입니다. 이것은 다소 미묘하며 일부 사용자가 쉽게 전체 조건 블록을 편집하도록 이끌 것입니다. 의도하지 않은 할당을 먼저 살펴보십시오. 로직 오류 / 오작동이 발생할 때마다.