Thiếu {
hoặc }
do thụt không chính xác
Các dấu ngoặc mã không khớp là phổ biến đối với mã có định dạng kém hơn, chẳng hạn như:
if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
Nếu mã của bạn trông như thế này, hãy bắt đầu lại từ đầu! Nếu không, nó không thể kết hợp với bạn hoặc bất cứ ai khác. Không có điểm nào trong việc hiển thị điều này trên internet để yêu cầu giúp đỡ.
Bạn sẽ chỉ có thể sửa nó, nếu bạn có thể theo dõi trực quan cấu trúc lồng nhau và mối quan hệ của if / other điều kiện và {
khối mã của chúng }
. Sử dụng IDE của bạn để xem tất cả chúng có được ghép nối không.
if (true) {
if (false) {
…
}
elseif ($whatever) {
if ($something2) {
…
}
else {
…
}
}
else {
…
}
if (false) { // a second `if` tree
…
}
else {
…
}
}
elseif (false) {
…
}
Bất kỳ đôi nào }
}
sẽ không chỉ đóng một nhánh, mà là một cấu trúc điều kiện trước đó. Do đó gắn bó với một phong cách mã hóa; không trộn và kết hợp trong các cây nếu / khác lồng nhau.
Ngoài sự nhất quán ở đây, nó cũng hữu ích để tránh các điều kiện dài quá. Sử dụng các biến hoặc hàm tạm thời để tránh các if
biểu hiện không thể đọc được .
IF
không thể được sử dụng trong các biểu thức
Một lỗi người mới thường xuyên đáng ngạc nhiên là cố gắng sử dụng một if
câu lệnh trong một biểu thức, chẳng hạn như một câu lệnh in:
⇓
echo "<a href='" . if ($link == "example.org") { echo …
Tất nhiên là không hợp lệ.
Bạn có thể sử dụng một điều kiện ternary , nhưng hãy cẩn thận với các tác động dễ đọc.
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
Mặt khác, phá vỡ các cấu trúc đầu ra như vậy: sử dụng nhiều if
s và echo
s .
Tốt hơn hết, hãy sử dụng các biến tạm thời và đặt các điều kiện của bạn trước:
if ($link) { $href = "yes"; } else { $href = "no"; }
echo "<a href='$href'>Link</a>";
Xác định hàm hoặc phương thức cho các trường hợp như vậy thường có ý nghĩa quá.
Khối điều khiển không trả về "kết quả"
Bây giờ điều này ít phổ biến hơn, nhưng một vài lập trình viên thậm chí cố gắng xử lý if
như thể nó có thể trả về một kết quả :
$var = if ($x == $y) { "true" };
Đó là cấu trúc giống hệt với việc sử dụng if
trong một chuỗi / biểu thức nối chuỗi.
- Nhưng cấu trúc điều khiển (nếu / foreach / while) không có "kết quả" .
- Chuỗi ký tự "true" cũng sẽ chỉ là một câu lệnh void.
Bạn sẽ phải sử dụng một bài tập trong khối mã :
if ($x == $y) { $var = "true"; }
Ngoài ra, sử dụng một ?:
so sánh ternary.
Nếu trong Nếu
Bạn không thể lồngif
trong một điều kiện:
⇓
if ($x == true and (if $y != false)) { ... }
Điều này rõ ràng là dư thừa, bởi vì and
(hoặc or
) đã cho phép so sánh chuỗi.
;
Dấu chấm phẩy bị lãng quên
Một lần nữa: Mỗi khối điều khiển cần phải là một tuyên bố. Nếu đoạn mã trước không bị chấm dứt bởi dấu chấm phẩy, thì đó là lỗi cú pháp được bảo đảm:
⇓
$var = 1 + 2 + 3
if (true) { … }
Btw, dòng cuối cùng trong một {…}
khối mã cũng cần một dấu chấm phẩy.
Dấu chấm phẩy quá sớm
Bây giờ có lẽ sai lầm khi đổ lỗi cho một phong cách mã hóa cụ thể, vì cạm bẫy này quá dễ bỏ qua:
⇓
if ($x == 5);
{
$y = 7;
}
else ←
{
$x = -1;
}
Điều đó xảy ra thường xuyên hơn bạn có thể tưởng tượng.
- Khi bạn chấm dứt
if ()
biểu thức với;
nó sẽ thực thi một câu lệnh void. Việc ;
trở thành một khoảng trống {}
của riêng nó!
- Các
{…}
khối như vậy được tách ra khỏi if
, và sẽ luôn luôn chạy.
- Vì vậy,
else
không còn có mối quan hệ với if
cấu trúc mở , đó là lý do tại sao điều này sẽ dẫn đến lỗi cú pháp T_ELSE không mong đợi.
Điều này cũng giải thích một biến thể tinh tế tương tự của lỗi cú pháp này:
if ($x) { x_is_true(); }; else { something_else(); };
Trường hợp ;
khối mã sau {…}
kết thúc toàn bộ if
cấu trúc, cắt else
nhánh theo cú pháp.
Không sử dụng khối mã
Nó cú pháp cho phép bỏ qua dấu ngoặc nhọn {
... }
cho các khối mã trong if
/ elseif
/ else
chi nhánh. Đáng buồn thay, một kiểu cú pháp rất phổ biến đối với các lập trình viên không đảo ngược. (Theo giả định sai, việc này nhanh hơn để gõ hoặc đọc).
Tuy nhiên, điều đó rất có khả năng làm tăng cú pháp. Sớm hay muộn các câu lệnh bổ sung sẽ tìm đường vào nhánh if / other:
if (true)
$x = 5;
elseif (false)
$x = 6;
$y = 7; ←
else
$z = 0;
Nhưng để thực sự sử dụng khối mã, bạn nào có để ghi {
... }
họ như vậy!
Ngay cả các lập trình viên dày dạn cũng tránh cú pháp không cần thiết này, hoặc ít nhất hiểu nó là một ngoại lệ đặc biệt đối với quy tắc.
Khác / Khác theo thứ tự sai
Một điều cần nhắc nhở bản thân là thứ tự có điều kiện , tất nhiên.
if ($a) { … }
else { … }
elseif ($b) { … }
↑
Bạn có thể có nhiều elseif
s như bạn muốn, nhưng else
phải đi sau cùng . Đó chỉ là cách nó được.
Khai báo lớp
Như đã đề cập ở trên , bạn không thể có các câu lệnh điều khiển trong một khai báo lớp:
class xyz {
if (true) {
function ($var) {}
}
Bạn đã quên một định nghĩa hàm hoặc đóng }
quá sớm trong các trường hợp như vậy.
T_ELSEIF / T_ELSE bất ngờ
Khi trộn PHP và HTML, việc đóng }
cho một if/elseif
phải nằm trong cùng một khối PHP <?php ?>
như tiếp theo elseif/else
. Điều này sẽ tạo ra lỗi khi đóng }
cho các if
nhu cầu là một phần của elseif
:
<?php if ($x) { ?>
html
<?php } ?>
<?php elseif ($y) { ?>
html
<?php } ?>
Các hình thức chính xác <?php } elseif
:
<?php if ($x) { ?>
html
<?php } elseif ($y) { ?>
html
<?php } ?>
Đây ít nhiều là một biến thể của thụt lề không chính xác - có lẽ thường dựa trên ý định mã hóa sai.
Bạn không thể nghiền nát báo cáo khác Inbetween if
và elseif
/ else
thẻ cấu trúc:
if (true) {
}
echo "in between"; ←
elseif (false) {
}
?> text <?php ←
else {
}
Hoặc chỉ có thể xảy ra trong {…}
các khối mã, không phải ở giữa các mã thông báo cấu trúc điều khiển.
- Điều này sẽ không có ý nghĩa nào. Không giống như có một số trạng thái "không xác định" khi PHP nhảy giữa
if
và else
các nhánh.
- Bạn sẽ phải quyết định nơi các câu lệnh in thuộc về / hoặc nếu chúng cần được lặp lại ở cả hai nhánh.
Bạn cũng không thể chia phần if / other giữa các cấu trúc điều khiển khác nhau:
foreach ($array as $i) {
if ($i) { … }
}
else { … }
Không có mối quan hệ cú pháp giữa if
và else
. Các foreach
phạm vi từ vựng đầu tại }
, do đó không có điểm cho if
cấu trúc để tiếp tục.
T_ENDIF
Nếu một T_ENDIF bất ngờ bị khiếu nại, bạn đang sử dụng phong cách cú pháp thay thế if:
⋯ elseif:
⋯ else:
⋯ endif;
. Mà bạn thực sự nên suy nghĩ hai lần về.
Một cạm bẫy phổ biến là nhầm lẫn đại tràng tương tự:
;
kỳ lạ cho một dấu chấm phẩy . (Được đề cập trong "Dấu chấm phẩy quá sớm")
Vì thụt lề khó theo dõi hơn trong các tệp mẫu, nên càng sử dụng cú pháp thay thế - điều đó hợp lý của bạn endif;
không khớp với bất kỳ if:
.
Sử dụng } endif;
là một -terminator nhân đôi if
.
Trong khi một "kết thúc $ bất ngờ" thường là giá cho một }
cú đúp xoăn bị lãng quên .
Chuyển nhượng so với so sánh
Vì vậy, đây không phải là một lỗi cú pháp, nhưng đáng nói trong bối cảnh này:
⇓
if ($x = true) { }
else { do_false(); }
Đó không phải là ==
/ ===
so sánh, mà là một =
bài tập . Điều này khá tinh tế và sẽ dễ dàng khiến một số người dùng bất lực chỉnh sửa toàn bộ các khối điều kiện. Trước tiên hãy coi chừng các bài tập ngoài ý muốn - khi bạn gặp phải lỗi logic / lỗi sai.