ไม่มี{
หรือ}
เนื่องจากการเยื้องไม่ถูกต้อง
การจัดตำแหน่งโค้ดที่ไม่ตรงกันเป็นเรื่องปกติของโค้ดที่มีการจัดรูปแบบที่น้อยกว่าเช่น:
if((!($opt["uniQartz5.8"]!=$this->check58)) or (empty($_POST['poree']))) {if
($true) {echo"halp";} elseif((!$z)or%b){excSmthng(False,5.8)}elseif (False){
หากรหัสของคุณมีลักษณะเช่นนี้เริ่มใหม่อีกครั้ง! มิฉะนั้นจะไม่สามารถแก้ไขได้สำหรับคุณหรือคนอื่น ๆ ไม่มีจุดประสงค์ในการแสดงบนอินเทอร์เน็ตเพื่อสอบถามความช่วยเหลือ
คุณจะสามารถที่จะแก้ไขได้ถ้าคุณมองเห็นสามารถทำตามโครงสร้างที่ซ้อนกันและความสัมพันธ์ของหาก / อื่นเงื่อนไขของพวกเขาและบล็อกรหัส{
}
ใช้ IDE ของคุณเพื่อดูว่าพวกเขากำลังจับคู่ทั้งหมด
if (true) {
if (false) {
…
}
elseif ($whatever) {
if ($something2) {
…
}
else {
…
}
}
else {
…
}
if (false) { // a second `if` tree
…
}
else {
…
}
}
elseif (false) {
…
}
คู่ใด ๆ}
}
จะไม่เพียง แต่ปิดสาขา แต่โครงสร้างเงื่อนไขก่อนหน้า ดังนั้นติดกับสไตล์การเข้ารหัสหนึ่ง; อย่าผสมและจับคู่ในต้นไม้ที่ซ้อนกันถ้า / อื่น ๆ
นอกเหนือจากความมั่นคงที่นี่แล้วยังมีประโยชน์ในการหลีกเลี่ยงเงื่อนไขที่ยาวเกินไป ใช้ตัวแปรหรือฟังก์ชันชั่วคราวเพื่อหลีกเลี่ยงif
-expressions ที่ไม่สามารถอ่านได้
IF
ไม่สามารถใช้ในการแสดงออก
ความผิดพลาดที่เกิดขึ้นบ่อยครั้งอย่างน่าประหลาดใจคือการพยายามใช้if
คำสั่งในนิพจน์เช่นคำสั่งพิมพ์:
⇓
echo "<a href='" . if ($link == "example.org") { echo …
ซึ่งไม่ถูกต้องแน่นอน
คุณสามารถใช้เงื่อนไขที่ประกอบไปด้วยสามแต่ระวังผลกระทบที่อ่านได้
echo "<a href='" . ($link ? "http://yes" : "http://no") . "</a>";
มิฉะนั้นจะทำลายโครงสร้างการส่งออกดังกล่าวขึ้นใช้งาน: ใช้หลายif
และecho
s
ยังดีกว่าใช้ตัวแปรชั่วคราวและวางเงื่อนไขของคุณก่อน:
if ($link) { $href = "yes"; } else { $href = "no"; }
echo "<a href='$href'>Link</a>";
การกำหนดฟังก์ชั่นหรือวิธีการสำหรับกรณีดังกล่าวมักจะสมเหตุสมผลเช่นกัน
กลุ่มควบคุมจะไม่ส่งคืน "ผลลัพธ์"
ตอนนี้เป็นเรื่องปกติน้อยลง แต่มีผู้เขียนโค้ดบางคนพยายามที่จะปฏิบัติif
ราวกับว่ามันสามารถส่งคืนผลลัพธ์ :
$var = if ($x == $y) { "true" };
ซึ่งมีโครงสร้างเหมือนกันกับการใช้if
ภายในการต่อสตริง / นิพจน์
- แต่โครงสร้างการควบคุม (ถ้า / foreach / ขณะที่) ไม่ได้มี"ผล"
- สตริงตัวอักษร "จริง" ก็จะเป็นงบโมฆะ
คุณจะต้องใช้งานที่ได้รับมอบหมายในบล็อครหัส :
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 ()
แสดงออกด้วย;
มันจะดำเนินการเป็นโมฆะคำสั่ง ;
กลายเป็นที่ว่างเปล่า{}
ของตัวเอง!
{…}
บล็อกจึงถูกถอดออกจากif
และจะทำงานเสมอ
- ดังนั้นจึง
else
ไม่มีความเกี่ยวข้องกับโครงสร้างแบบเปิดอีกต่อไปif
ซึ่งเป็นสาเหตุที่สิ่งนี้จะนำไปสู่ข้อผิดพลาดทางไวยากรณ์ที่ไม่คาดคิดของ T_ELSE
ซึ่งยังอธิบายถึงรูปแบบที่ลึกซึ้งของข้อผิดพลาดทางไวยากรณ์นี้เช่นกัน:
if ($x) { x_is_true(); }; else { something_else(); };
ในกรณีที่;
หลังจากบล็อกรหัส{…}
สิ้นสุดการif
สร้างทั้งหมดการelse
แยกสาขาวากยสัมพันธ์
ไม่ได้ใช้บล็อคโค้ด
มันได้รับอนุญาต syntactically ที่จะละเว้นวงเล็บปีกกา{
… }
สำหรับบล็อกรหัสใน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;
ซึ่งคุณควรคิดอย่างรอบคอบเกี่ยวกับสองครั้ง
อันตรายร่วมกันสับสน eerily คล้าย:
ลำไส้ใหญ่สำหรับ;
อัฒภาค (ครอบคลุมใน "เซมิโคลอนเร็วเกินไป")
ในฐานะที่เป็นเยื้องยากที่จะติดตามในแฟ้มแม่แบบมากขึ้นเมื่อใช้ไวยากรณ์ทางเลือก - มันเป็นไปได้ของคุณไม่ตรงกับendif;
if:
ใช้} endif;
เป็นสองเท่า if
-terminator
ในขณะที่ "$ end ที่ไม่คาดคิด" มักเป็นราคาสำหรับการ}
ดัดลอนแบบปิดที่ถูกลืม
การบ้านและการเปรียบเทียบ
ดังนั้นนี่ไม่ใช่ข้อผิดพลาดทางไวยากรณ์ แต่ควรกล่าวถึงในบริบทนี้:
⇓
if ($x = true) { }
else { do_false(); }
นั่นไม่ใช่==
/ ===
การเปรียบเทียบ แต่=
ที่ได้รับมอบหมาย สิ่งนี้ค่อนข้างบอบบางและจะทำให้ผู้ใช้บางคนแก้ไขบล็อกเงื่อนไขทั้งหมดได้อย่างไร้ประโยชน์ ระวังการมอบหมายที่ไม่ได้ตั้งใจก่อน - เมื่อใดที่คุณประสบกับข้อผิดพลาดทางตรรกะ / การกระทำผิด