ข้อผิดพลาดในการแยกวิเคราะห์ / ไวยากรณ์ของ PHP และวิธีแก้ปัญหา


652

ทุกคนพบข้อผิดพลาดทางไวยากรณ์ แม้แต่โปรแกรมเมอร์ผู้มีประสบการณ์ก็ยังพิมพ์ผิด สำหรับผู้มาใหม่มันเป็นเพียงส่วนหนึ่งของกระบวนการเรียนรู้ อย่างไรก็ตามบ่อยครั้งที่ง่ายต่อการตีความข้อความผิดพลาดเช่น:

ข้อผิดพลาดในการแยกวิเคราะห์ PHP: ข้อผิดพลาดทางไวยากรณ์, '{' ที่ไม่คาดคิดใน index.php บรรทัดที่ 20

สัญลักษณ์ที่ไม่คาดคิดไม่ได้เป็นตัวการที่แท้จริงเสมอไป แต่หมายเลขบรรทัดนั้นให้ข้อมูลคร่าวๆเกี่ยวกับตำแหน่งที่จะเริ่มมองหา

ดูบริบทของรหัสเสมอ ความผิดพลาดที่ไวยากรณ์มักจะซ่อนอยู่ในที่กล่าวถึงหรือในสายรหัสก่อนหน้านี้ เปรียบเทียบรหัสของคุณกับตัวอย่างไวยากรณ์จากคู่มือ

ในขณะที่ไม่ใช่ทุกกรณีตรงกับที่อื่น ๆ แต่มีบางขั้นตอนทั่วไปที่จะแก้ข้อผิดพลาดทางไวยากรณ์ การอ้างอิงนี้สรุปข้อผิดพลาดทั่วไป:

การอ้างอิงที่เกี่ยวข้องอย่างใกล้ชิด:

และ:

ในขณะที่ Stack Overflow ก็ให้การต้อนรับนักเขียนหน้าใหม่ด้วย แต่ส่วนใหญ่จะถูกตั้งคำถามกับคำถามการเขียนโปรแกรมระดับมืออาชีพ

  • การตอบข้อผิดพลาดในการเขียนโค้ดของทุกคนและการพิมพ์ผิด ๆ นั้นส่วนใหญ่จะเป็นเรื่องนอกหัวข้อ
  • ดังนั้นโปรดสละเวลาในการทำตามขั้นตอนพื้นฐานก่อนโพสต์คำขอแก้ไขไวยากรณ์
  • หากคุณยังต้องแสดงความคิดริเริ่มในการแก้ปัญหาของคุณเองพยายามแก้ไขและกระบวนการคิดของคุณเกี่ยวกับสิ่งที่ดูเหมือนหรืออาจผิด

หากเบราว์เซอร์ของคุณแสดงข้อความแสดงข้อผิดพลาดเช่น "SyntaxError: อักขระผิดกฎหมาย" แสดงว่าไม่ใช่ของจริง- ที่เกี่ยวข้อง แต่ - ไวยากรณ์ผิดพลาด


ข้อผิดพลาดทางไวยากรณ์ที่เกิดขึ้นกับรหัสผู้ขาย:สุดท้ายให้พิจารณาว่าหากข้อผิดพลาดทางไวยากรณ์ไม่ได้ถูกยกขึ้นโดยการแก้ไข codebase ของคุณ แต่หลังจากติดตั้งหรืออัปเกรดแพ็คเกจผู้ขายภายนอกอาจเป็นเพราะความเข้ากันไม่ได้ของรุ่น PHP ติดตั้ง.


1
ข้อมูลนี้ไม่เพียงพอที่จะเป็นคำตอบ แต่สามารถเขียนวิเคราะห์ด้วย parsekit_compile_string และใส่คำตอบที่เป็นมิตรกับมัน หากรวมเข้ากับ IDE ของคุณนี่อาจเป็นข้อมูลที่ค่อนข้าง
Owen Beresford

4
คุณใส่จำนวนงานที่น่าประทับใจลงในสิ่งนี้ เคารพในสิ่งนั้น มันอาจจะดีมากสำหรับครูที่จะเรียนรู้วิธีชี้ข้อผิดพลาดอย่างรวดเร็วหรือสำหรับผู้ที่สร้าง IDEs หรือใช้การแก้ไขอย่างรวดเร็ว อย่างไรก็ตาม IDEs จะทำงานส่วนใหญ่ให้คุณได้อย่างมีประสิทธิภาพตามที่ @Panique แนะนำ นอกจากนี้หลาย ๆ กรณีการเริ่มต้นใหม่จากศูนย์เป็นตัวเลือกที่ดี
allprog

1
@ Fred-ii- ฉันคิดว่าสาเหตุส่วนใหญ่คล้ายกับT_IF / T_FOREACH / ...บล็อก แม้ว่าฉันต้องการรวบรวมสรุปแบบกำหนดเองเพิ่มเติมสำหรับคำถาม IF / ELSE / ELSEIF
มาริโอ

1
@mario ไม่ทราบวิธีการใช้วลีนี้ แต่คำถามและคำตอบนี้ควรจะเป็นบิตที่เขียนใหม่และมีโครงสร้างมากขึ้น? (ความคิดเห็นชั่วคราว)
Rizier123

2
คุณรู้ไหมฉันหวังว่าฉันจะมีรายการนี้เมื่อฉันเรียนรู้ PHP เมื่อหลายปีก่อนมีประโยชน์มากโดยเฉพาะอย่างยิ่งสำหรับผู้เริ่มต้น
Chipster

คำตอบ:


291

ข้อผิดพลาดทางไวยากรณ์คืออะไร

PHP เป็นของC-styleและภาษาการเขียนโปรแกรมที่จำเป็น มีกฎไวยากรณ์ที่เข้มงวดซึ่งไม่สามารถกู้คืนได้เมื่อพบสัญลักษณ์หรือตัวระบุที่วางผิดที่ ไม่สามารถเดาความตั้งใจในการเข้ารหัสของคุณได้

ไวยากรณ์คำจำกัดความของฟังก์ชัน

เคล็ดลับที่สำคัญที่สุด

มีข้อควรระวังพื้นฐานบางประการที่คุณสามารถทำได้:

  • ใช้การเยื้องโค้ดที่เหมาะสมหรือปรับใช้รูปแบบการเข้ารหัสที่สูงส่ง การอ่านช่วยป้องกันความผิดปกติ

  • ใช้IDEหรือแก้ไขสำหรับ PHPกับการเน้นไวยากรณ์ ซึ่งยังช่วยในวงเล็บ / วงเล็บสมดุล

    คาดว่า: อัฒภาค

  • อ่านการอ้างอิงภาษาและตัวอย่างในคู่มือ สองครั้งเพื่อให้มีความเชี่ยวชาญค่อนข้าง

วิธีตีความตัวแยกวิเคราะห์ข้อผิดพลาด

ข้อความแสดงข้อผิดพลาดทางไวยากรณ์ทั่วไปอ่าน:

ข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาดทางไวยากรณ์, T_STRING ที่ไม่คาดคิด, คาดหวังว่า' ;'ในfile.phpในบรรทัด 217

ซึ่งแสดงตำแหน่งที่เป็นไปได้ของความผิดพลาดทางไวยากรณ์ ดูที่กล่าวถึงชื่อไฟล์และหมายเลขบรรทัด

ชื่อเล่นเช่นT_STRINGอธิบายซึ่งสัญลักษณ์ parser / tokenizer ไม่สามารถดำเนินการในที่สุด อย่างไรก็ตามนี่ไม่ได้เป็นสาเหตุของความผิดพลาดทางไวยากรณ์

สิ่งสำคัญคือต้องมองเข้าไปในบรรทัดรหัสก่อนหน้าเช่นกัน บ่อยครั้งที่ข้อผิดพลาดทางไวยากรณ์เป็นเพียงอุบัติเหตุที่เกิดขึ้นก่อนหน้านี้ หมายเลขบรรทัดข้อผิดพลาดเป็นเพียงที่ parser สรุปให้ดำเนินการทั้งหมด

การแก้ไขข้อผิดพลาดทางไวยากรณ์

มีวิธีการมากมายที่จะ จำกัด และแก้ไข hiccups ไวยากรณ์

  • เปิดไฟล์ต้นฉบับที่กล่าวถึง มองไปที่คนกล่าวถึงสายรหัส

    • สำหรับสตริงที่ควบคุมไม่ได้และตัวดำเนินการที่วางผิดตำแหน่งนี่คือตำแหน่งที่คุณหาผู้กระทำผิด

    • อ่านบรรทัดจากซ้ายไปขวาและจินตนาการว่าแต่ละสัญลักษณ์ทำอะไร

  • บ่อยขึ้นคุณต้องดูที่บรรทัดก่อนหน้าเช่นกัน

    • โดยเฉพาะอย่างยิ่ง;เครื่องหมายอัฒภาคที่ขาดหายไปจะหายไปที่บรรทัดก่อนหน้าสิ้นสุด / คำสั่ง (อย่างน้อยจากมุมมองของสำนวน)

    • หาก{บล็อคโค้ด}ถูกปิดหรือซ้อนกันไม่ถูกต้องคุณอาจต้องตรวจสอบซอร์สโค้ดเพิ่มเติม ใช้การเยื้องรหัสที่เหมาะสมเพื่อทำให้ง่ายขึ้น

  • ดูสีไวยากรณ์ !

    • สตริงและตัวแปรและค่าคงที่ควรมีสีที่ต่างกัน

    • ผู้ประกอบการ+-*/.ควรย้อมสีที่แตกต่างกันเช่นกัน อย่างอื่นพวกเขาอาจจะอยู่ในบริบทที่ไม่ถูกต้อง

    • หากคุณเห็นว่าการเพิ่มสีสตริงยาวเกินไปหรือสั้นเกินไปแสดงว่าคุณพบเครื่องหมายปิด"หรือ'เครื่องหมายสตริง

    • การมีเครื่องหมายวรรคตอนที่เป็นสีเดียวกันสองตัวติดกันอาจทำให้เกิดปัญหาได้เช่นกัน โดยปกติแล้วผู้ประกอบการที่มีคนเดียวหากยังไม่ได้++, --หรือวงเล็บต่อไปดำเนินการ สองสาย / ตัวระบุโดยตรงต่อกันไม่ถูกต้องในบริบทส่วนใหญ่

  • ช่องว่างเป็นเพื่อนของคุณ ทำตามสไตล์การเข้ารหัส ใด ๆ

  • เลิกสายยาวชั่วคราว

    • คุณสามารถเพิ่มบรรทัดใหม่ระหว่างตัวดำเนินการหรือค่าคงที่และสตริงได้อย่างอิสระ ตัวแยกวิเคราะห์จะทำการรวมหมายเลขบรรทัดสำหรับข้อผิดพลาดในการแยกวิเคราะห์ แทนที่จะดูรหัสที่มีความยาวมากคุณสามารถแยกสัญลักษณ์ไวยากรณ์ที่หายไปหรือหายไป

    • แยกifคำสั่งที่ซับซ้อนออกเป็นifเงื่อนไขที่แตกต่างหรือซ้อนกัน

    • แทนที่จะใช้สูตรคณิตศาสตร์ที่มีความยาวหรือโซ่แบบลอจิกให้ใช้ตัวแปรชั่วคราวเพื่อทำให้รหัสง่ายขึ้น (อ่านง่ายขึ้น = ข้อผิดพลาดน้อยลง)

    • เพิ่มบรรทัดใหม่ระหว่าง:

      1. รหัสที่คุณสามารถระบุได้อย่างถูกต้อง
      2. ชิ้นส่วนที่คุณไม่แน่ใจเกี่ยวกับ
      3. และเส้นที่ parser บ่นเกี่ยวกับ

      การแบ่งพาร์ติชันบล็อกโค้ดแบบยาวจริงๆช่วยในการค้นหาที่มาของข้อผิดพลาดทางไวยากรณ์

  • ใส่รหัสความผิด

    • หากคุณไม่สามารถแยกแหล่งที่มาของปัญหาได้ให้เริ่มคอมเม้นต์ (และลบออกชั่วคราว) บล็อกของรหัส

    • ทันทีที่คุณกำจัดข้อผิดพลาดในการแยกวิเคราะห์คุณได้พบแหล่งที่มาของปัญหา มองดูใกล้ ๆ

    • บางครั้งคุณต้องการลบบล็อกฟังก์ชัน / เมธอดที่สมบูรณ์แบบชั่วคราว (ในกรณีที่มีเครื่องหมายปีกกาที่ไม่ตรงกันและรหัสเยื้องอย่างไม่ถูกต้อง)

    • เมื่อคุณไม่สามารถแก้ไขปัญหาไวยากรณ์พยายามที่จะเขียนแสดงความคิดเห็นออกมาส่วนจากรอยขีดข่วน

  • ในฐานะผู้ใช้ใหม่ให้หลีกเลี่ยงการสร้างไวยากรณ์ที่สับสน

    • ? :ผู้ประกอบการเงื่อนไขที่สามสามารถกะทัดรัดรหัสและมีประโยชน์แน่นอน แต่มันไม่ได้ช่วยให้อ่านง่ายในทุกกรณี ชอบifข้อความธรรมดาในขณะที่ไม่ได้ไป

    • ไวยากรณ์ทางเลือกของ PHP ( if:/ elseif:/ endif;) เป็นเรื่องปกติสำหรับเทมเพลต แต่เนื้อหานั้นง่ายต่อการติดตามน้อยกว่าบล็อค{โค้ดปกติ}

  • ข้อผิดพลาดของผู้มาใหม่ที่แพร่หลายที่สุดคือ:

    • อัฒภาคที่ขาดหายไป;สำหรับการยกเลิกข้อความ / บรรทัด

    • คำพูดสตริงไม่ตรงกันสำหรับ"หรือ'และคำพูดที่ไม่หลีกหนีภายใน

    • ตัวดำเนินการที่ถูกลืมโดยเฉพาะอย่างยิ่งสำหรับการ.ต่อข้อมูลสตริง

    • ไม่สมดุลวงเล็บ( )นับไว้ในบรรทัดที่รายงาน มีจำนวนเท่ากันหรือไม่

  • อย่าลืมว่าการแก้ปัญหาไวยากรณ์หนึ่งสามารถเปิดเผยสิ่งต่อไปได้

    • หากคุณทำให้ปัญหาหนึ่งหายไป แต่พืชอื่น ๆ ในรหัสด้านล่างบางส่วนคุณอยู่บนเส้นทางที่ถูกต้อง

    • หากหลังจากแก้ไขข้อผิดพลาดทางไวยากรณ์ใหม่จะเพิ่มขนาดขึ้นในบรรทัดเดียวกันแสดงว่าการเปลี่ยนแปลงที่คุณพยายามทำนั้นอาจเป็นความล้มเหลว (ไม่เสมอไป)

  • คืนค่าสำเนาสำรองของรหัสที่ทำงานก่อนหน้านี้หากคุณไม่สามารถแก้ไขได้

    • ใช้ระบบการกำหนดเวอร์ชันของซอร์สโค้ด คุณสามารถดูdiffเวอร์ชันที่ใช้งานไม่ได้และเวอร์ชันล่าสุด ซึ่งอาจเป็นความกระจ่างว่าปัญหาไวยากรณ์คืออะไร
  • อักขระ Unicode เร่ร่อนที่มองไม่เห็น : ในบางกรณีคุณต้องใช้ hexeditorหรือตัวแก้ไข / โปรแกรมดูอื่นบนแหล่งที่มาของคุณ ไม่พบปัญหาบางอย่างจากการดูรหัสของคุณ

    • ลองใช้grep --color -P -n "\[\x80-\xFF\]" file.phpการวัดครั้งแรกเพื่อค้นหาสัญลักษณ์ที่ไม่ใช่ ASCII

    • โดยเฉพาะอย่างยิ่ง BOMs ช่องว่างที่มีความกว้างเป็นศูนย์หรือช่องว่างที่ไม่แบ่งและการเสนอราคาอัจฉริยะเป็นประจำสามารถหาทางลงในซอร์สโค้ดได้

  • ดูแลlinebreaks ประเภทใดที่จะถูกบันทึกในไฟล์

    • PHP เพียงเกียรตินิยม\nบรรทัดใหม่ไม่ได้\rผลตอบแทนการขนส่ง

    • สิ่งใดบ้างที่เป็นปัญหาสำหรับผู้ใช้ MacOS (แม้แต่ใน OS X สำหรับผู้แก้ไขที่กำหนดค่าผิดพลาด)

    • มันมักจะพื้นผิวเป็นปัญหาเมื่อมีการใช้บรรทัดเดียว//หรือ#ความคิดเห็น /*...*/ความคิดเห็นหลายรายการไม่ค่อยรบกวนโปรแกรมแยกวิเคราะห์เมื่อ linebreaks ถูกละเว้น

  • หากข้อผิดพลาดทางไวยากรณ์ของคุณไม่ได้ส่งผ่านทางเว็บ : มันเกิดขึ้นว่าคุณมีข้อผิดพลาดทางไวยากรณ์ในเครื่องของคุณ แต่โพสต์ไฟล์เดียวกันออนไลน์ไม่ได้แสดงอีกต่อไป ซึ่งสามารถหมายถึงหนึ่งในสองสิ่งเท่านั้น:

    • คุณกำลังดูไฟล์ผิด!

    • หรือรหัสของคุณมี Unicode หลงทางที่มองไม่เห็น (ดูด้านบน) คุณสามารถค้นหาได้อย่างง่ายดาย: เพียงแค่คัดลอกรหัสของคุณกลับมาจากเว็บฟอร์มลงในโปรแกรมแก้ไขข้อความ

  • ตรวจสอบของคุณPHP รุ่น โครงสร้างไวยากรณ์ทั้งหมดไม่พร้อมใช้งานบนทุกเซิร์ฟเวอร์

    • php -v สำหรับล่ามบรรทัดคำสั่ง

    • <?php phpinfo(); สำหรับสิ่งที่เรียกผ่านเว็บเซิร์ฟเวอร์


    สิ่งเหล่านั้นไม่จำเป็นต้องเหมือนกัน โดยเฉพาะอย่างยิ่งเมื่อทำงานกับเฟรมเวิร์กคุณจะต้องจับคู่ให้ตรงกัน

  • อย่าใช้คำสำคัญที่สงวนไว้ของ PHPเป็นตัวระบุสำหรับฟังก์ชั่น / วิธีการ, คลาสหรือค่าคงที่

  • การทดลองและข้อผิดพลาดเป็นทางเลือกสุดท้ายของคุณ

หากทุกอย่างล้มเหลวคุณสามารถgoogleข้อความแสดงข้อผิดพลาดของคุณได้เสมอ สัญลักษณ์ไวยากรณ์ไม่ง่ายในการค้นหา (Stack Overflow เองถูกทำดัชนีโดยSymbolHoundแม้ว่า) ดังนั้นจึงอาจใช้เวลาดูหน้าอีกไม่กี่หน้าก่อนที่คุณจะพบสิ่งที่เกี่ยวข้อง

คำแนะนำเพิ่มเติม:

หน้าจอสีขาวแห่งความตาย

หากเว็บไซต์ของคุณว่างเปล่าโดยทั่วไปข้อผิดพลาดทางไวยากรณ์จะเป็นสาเหตุ เปิดใช้งานการแสดงผลด้วย:

  • error_reporting = E_ALL
  • display_errors = 1

ในphp.iniทั่วไปหรือผ่านของคุณ.htaccessสำหรับ mod_php หรือแม้กระทั่ง.user.iniกับการตั้งค่า FastCGI

การเปิดใช้งานสคริปต์ที่ใช้งานไม่ได้นั้นช้าเกินไปเนื่องจาก PHP ไม่สามารถตีความ / เรียกใช้บรรทัดแรกได้ วิธีแก้ปัญหาด่วนคือการสร้างสคริปต์ตัวตัดคำพูดtest.php:

<?php
   error_reporting(E_ALL);
   ini_set("display_errors", 1);
   include("./broken-script.php");

จากนั้นเรียกใช้รหัสที่ล้มเหลวโดยเข้าถึงสคริปต์ตัวตัดคำนี้

นอกจากนี้ยังช่วยในการเปิดใช้งาน PHP error_logและดูในเว็บเซิร์ฟเวอร์error.logของคุณเมื่อสคริปต์ขัดข้องด้วยการตอบสนอง HTTP 500


error_reporting(E_ALL | E_STRICT);สำหรับ PHP รุ่นก่อนหน้า
Geo

2
IDE บางตัว (เช่น NetBeans) ไม่เพียง แต่รองรับการเน้นไวยากรณ์ แต่ยังจัดรูปแบบรหัส หากคุณมีปัญหาในการจัดรูปแบบโค้ดของคุณอย่างถูกต้องและขอให้ IDE ทำการฟอร์แมตใหม่ในบางครั้งคุณอาจพบปัญหาที่ยากลำบากเช่นการจัดฟันที่ไม่มีใครเทียบ
Josep Valls

115

ฉันคิดว่าหัวข้อนี้เกินความเป็นจริง / ซับซ้อนเกินไป การใช้ IDE เป็นวิธีการหลีกเลี่ยงข้อผิดพลาดทางไวยากรณ์อย่างสมบูรณ์ ฉันจะพูดด้วยซ้ำว่าการทำงานโดยไม่มี IDE นั้นช่างเป็นมืออาชีพ ทำไม? เพราะ IDEs สมัยใหม่ตรวจสอบไวยากรณ์ของคุณหลังจากตัวละครทุกตัวที่คุณพิมพ์ เมื่อรหัสและบรรทัดทั้งหมดของคุณเปลี่ยนเป็นสีแดงและคำเตือนการแจ้งเตือนขนาดใหญ่แสดงประเภทที่แน่นอนและตำแหน่งที่แน่นอนของข้อผิดพลาดทางไวยากรณ์ดังนั้นคุณไม่จำเป็นต้องค้นหาวิธีแก้ไขปัญหาอื่นอีก

การใช้การตรวจสอบไวยากรณ์หมายถึง:

คุณจะ (อย่างมีประสิทธิภาพ) จะไม่พบข้อผิดพลาดทางไวยากรณ์อีกครั้งเพียงเพราะคุณเห็นพวกเขาทันทีที่คุณพิมพ์ อย่างจริงจัง.

IDE ที่ยอดเยี่ยมพร้อมการตรวจสอบไวยากรณ์ (ทั้งหมดนี้มีให้สำหรับ Linux, Windows และ Mac):

  1. NetBeans [ฟรี]
  2. PHPS รูปแบบ [$ 199 USD]
  3. Eclipseพร้อมปลั๊กอิน PHP [ฟรี]
  4. ประเสริฐ [$ 80 USD] (ส่วนใหญ่เป็นโปรแกรมแก้ไขข้อความ แต่สามารถขยายได้ด้วยปลั๊กอินเช่นPHP Syntax Parser )

2
เห็นได้ชัดว่ามันเป็น อย่างไรก็ตามการต่อต้าน IDEs ที่นี่คุณสามารถอธิบายรายละเอียดเล็กน้อยเกี่ยวกับความช่วยเหลือด้านไวยากรณ์ของพวกเขาได้หรือไม่? ประเสริฐส่วนใหญ่เป็นบรรณาธิการไม่ใช่ IDE; แต่ก็ดูน่ารักและเร็วขึ้น ทำเพียงแค่เน้นไวยากรณ์สูง แต่ยังเป็นจริงที่จับคู่วงเล็บ พบข้อผิดพลาด T_CONSTANT_AND_ENCAPSED ได้ทันทีเช่นไม่เหมือน PHPStorm ซึ่งจะทำอย่างไรบรรทัดเพิ่มเติมไก่เขี่ยสำหรับข้อผิดพลาดแบบอินไลน์ คำใบ้ไวยากรณ์ NetBeans เคยใช้เป็นความลับมากกว่า PHP แม้ (อนุญาตให้สร้างสิ่งต่อไปได้มากกว่า) คุณสามารถแบ่งปันประสบการณ์ของคุณเกี่ยวกับข้อดี / ข้อเสีย; Eclipse / PDT ที่คุณชื่นชอบหรือ ..
มาริโอ

@mario ฉันคิดว่าคุณอยู่ลึกเข้าไปในหัวข้อดังนั้นฉันไม่ต้องการพูดอะไรผิดพลาดที่นี่ แต่รหัสทั้งหมดที่ฉัน (และเพื่อนร่วมทีมของฉันเพื่อนที่รหัสพันธมิตรอิสระ) เคยเขียนใน IDE ไม่เคยถูกประหารชีวิต ด้วยข้อผิดพลาดทางไวยากรณ์ ดังนั้นฉันคิดว่าอย่างน้อยการตรวจสอบไวยากรณ์ของ Netbeans / PHPStorm นั้นมีประสิทธิภาพมาก แต่บางทีฉันอาจจะผิดคำถามของคุณ ลองดูสัก
ครู่

คำตอบของคุณเป็นที่เรียบร้อยแล้ว จะพอดีกับคำถามของเรา 99% อย่างไรก็ตามสำหรับบริบทที่นี่ฉันต้องการการพิจารณาการออกบนซึ่ง IDE ให้คำแนะนำมือใหม่ง่ายมากขึ้น อาจเป็นเรื่องเล็กน้อยสำหรับเราการกำหนดสีและเส้นไก่เขี่ยให้เพียงพอหากคุณมีประสบการณ์เพียงพอ แต่ฉันคิดว่าความแตกต่างอาจมีความสำคัญมากกว่าสำหรับผู้เริ่มต้น
มาริโอ

บางครั้ง IDE ไม่ใช่ตัวเลือกที่เป็นไปได้ ตัวอย่างเช่นการแก้ไขธีม WordPress หรือปลั๊กอินอย่างรวดเร็ว ใช่ฉันสามารถคัดลอกรหัสทั้งหมดลงใน IDE ได้ แต่จากนั้นฉันต้องเปิดขึ้นวางทั้งหมดลงในนั้นตั้งค่าส่วนหัวและทุกครั้งที่เสียอึเมื่อฉันแค่หวังว่าจะแก้ไขอย่างรวดเร็ว ตอนนี้ถ้าคุณกำลังพัฒนาคุณสมบัติใหม่หรือเริ่มจากศูนย์แล้วใช่ทำใน IDE คุณจะไม่เสียใจที่ต้องใช้เวลาเพิ่มเล็กน้อยในการเริ่มต้นตั้งค่า
1934286

ฉันเห็นว่า IDE เป็นตัวอย่างไม่ใช่แค่กล่องเครื่องมือ อาจไม่แก้ไข แต่สามารถช่วยคุณค้นหาและป้องกันข้อผิดพลาดทางไวยากรณ์ คำตอบมากมายที่นี่ดูเหมือนจะบอกว่าถ้าคุณรักษาโค้ดให้สะอาดคุณมีโอกาสน้อยที่จะทำผิดพลาดและง่ายต่อการตรวจสอบ ด้วยการเยื้องอัตโนมัติคำแนะนำโค้ดการเกิดขึ้นของตัวแปรวงเล็บปิดอัตโนมัติและการจัดรูปแบบอัตโนมัติช่วยให้ฉันพิมพ์ผิดจำนวนมากต่อวันและเป็นข้อได้เปรียบหลักว่าทำไมฉันจึงใช้อย่างใดอย่างหนึ่ง นี่ไม่ใช่การนับทุกอย่างอื่นนอกเหนือจากขอบเขตของคำถามนี้ (ดีบักเกอร์, ตัวเชื่อมต่อฐานข้อมูล, uml diagram ฯลฯ ) IDE จะช่วยคุณประหยัดเวลาและจะป้องกันมากกว่าข้อผิดพลาดทางไวยากรณ์
Louis Loudog Trottier

58

ไม่คาดฝัน [

ทุกวันนี้[วงเล็บอาร์เรย์ที่ไม่คาดคิดมักพบเห็นในเวอร์ชัน PHP ที่ล้าสมัย ไวยากรณ์อาร์เรย์สั้นสามารถใช้ได้ตั้งแต่ PHP > = 5.4 array()การติดตั้งเก่าสนับสนุนเท่านั้น

$php53 = array(1, 2, 3);
$php54 = [1, 2, 3];
         

การยกเลิกการอ้างอิงผลลัพธ์ของฟังก์ชัน Array นั้นไม่สามารถใช้ได้สำหรับ PHP รุ่นเก่ากว่า:

$result = get_whatever()["key"];
                      

ข้อมูลอ้างอิง - ข้อผิดพลาดนี้หมายถึงอะไรใน PHP - "ข้อผิดพลาดทางไวยากรณ์ที่ไม่คาดคิด\["แสดงวิธีแก้ปัญหาที่พบได้บ่อยและใช้งานได้จริง

แม้ว่าคุณจะดีกว่าเสมอเพียงอัปเกรดการติดตั้ง PHP ของคุณ สำหรับแผนการโฮสต์เว็บที่ใช้ร่วมกันให้ทำการวิจัยก่อนหากSetHandler php56-fcgiสามารถใช้เพื่อเปิดใช้งานรันไทม์ที่ใหม่กว่า

ดูสิ่งนี้ด้วย:

BTW นอกจากนี้ยังมีตัวประมวลผลล่วงหน้าและPHP 5.4 ซินแท็กซ์ - ดาวน์คอนเวอร์เตอร์ถ้าคุณติดใจกับ PHP เวอร์ชันเก่าและช้าลง

สาเหตุอื่น ๆ สำหรับข้อผิดพลาดทางไวยากรณ์ที่ไม่คาดคิด[

หากไม่ใช่รุ่น PHP ที่ไม่ตรงกันอาจเกิดข้อผิดพลาดทางไวยากรณ์หรือการพิมพ์ผิดปกติ:

  • คุณไม่สามารถใช้การประกาศ / นิพจน์คุณสมบัติอาร์เรย์ในคลาสได้แม้แต่ใน PHP 7

    protected $var["x"] = "Nope";
                  
  • การสับสน[กับการเปิดวงเล็บปีกกา{หรือวงเล็บ(คือการกำกับดูแลทั่วไป

    foreach [$a as $b)
            

    หรือแม้กระทั่ง:

    function foobar[$a, $b, $c] {
                   
  • หรือพยายามอ้างอิงค่าคงที่ (ก่อน PHP 5.6) เป็นอาร์เรย์:

    $var = const[123];
           

    อย่างน้อย PHP ตีความว่าconstเป็นชื่อคงที่

    ถ้าคุณหมายถึงการเข้าถึงตัวแปรอาร์เรย์ (ซึ่งเป็นสาเหตุทั่วไปที่นี่) แล้วเพิ่มชั้นนำ$เครื่องหมาย - $varnameดังนั้นมันจะกลายเป็น

  • คุณกำลังพยายามใช้globalคำหลักในสมาชิกของอาเรย์แบบเชื่อมโยง นี่ไม่ใช่ไวยากรณ์ที่ถูกต้อง:

    global $var['key'];


ไม่คาดคิดวงเล็บเหลี่ยม] ปิด

สิ่งนี้ค่อนข้างที่หายาก แต่ก็มีอุบัติเหตุจากการซิงโครไนซ์ด้วย]วงเล็บเหลี่ยมที่สิ้นสุด

  • ไม่ตรงกันอีกครั้งกับ)วงเล็บหรือ}วงเล็บปีกกาเป็นเรื่องปกติ:

    function foobar($a, $b, $c] {
                              
  • หรือพยายามที่จะจบอาร์เรย์ที่ไม่มี:

    $var = 2];

    ซึ่งมักจะเกิดขึ้นในหลายสายและซ้อนกันประกาศอาร์เรย์

    $array = [1,[2,3],4,[5,6[7,[8],[9,10]],11],12]],15];
                                                 

    ถ้าเป็นเช่นนั้นใช้ IDE ของคุณสำหรับการจับคู่วงเล็บเหลี่ยมเพื่อค้นหา]การปิดอาร์เรย์ก่อนวัยอันควร อย่างน้อยที่สุดใช้ระยะห่างและบรรทัดใหม่เพื่อ จำกัด ขอบเขตให้แคบลง


ลิงก์ 'ตัวแปลงดาวน์ - คอนของไวยากรณ์ PHP PHP' github.com/IonutBajescu/short-arrays-to-long-arraysด้านบนเสีย
Danimal Reks

46

ไม่คาดหวัง T_VARIABLE

"ไม่คาดคิดT_VARIABLE" หมายความว่ามี$variableชื่อตามตัวอักษรซึ่งไม่พอดีกับโครงสร้างนิพจน์ / คำสั่งปัจจุบัน

ผู้ประกอบการที่เป็นนามธรรม / ไม่แน่นอน + ไดอะแกรมตัวแปร $

  1. อัฒภาคหายไป

    โดยทั่วไปจะระบุอัฒภาคที่ขาดหายไปในบรรทัดก่อนหน้า การกำหนดตัวแปรตามคำสั่งเป็นตัวบ่งชี้ที่ดีว่าจะดูที่:

           
    func1()
    $var = 1 + 2;     # parse error in line +2
  2. การต่อสตริง

    อุบัติเหตุที่พบบ่อยคือการต่อสายอักขระกับ.ตัวดำเนินการที่ถูกลืม:

                                   
    print "Here comes the value: "  $value;

    Btw คุณควรชอบการสอดแทรกสตริง (ตัวแปรพื้นฐานในเครื่องหมายคำพูดคู่) เมื่อใดก็ตามที่ช่วยให้สามารถอ่านได้ ซึ่งหลีกเลี่ยงปัญหาไวยากรณ์เหล่านี้

    การแก้ไขสตริงเป็นคุณลักษณะหลักของภาษาสคริปต์ ไม่มีความละอายในการใช้งาน ละเว้นใด ๆ ให้คำแนะนำไมโครเพิ่มประสิทธิภาพเกี่ยวกับตัวแปร.เรียงต่อกันเป็นเร็วขึ้น มันไม่ใช่.

  3. ไม่มีตัวดำเนินการนิพจน์

    แน่นอนปัญหาเดียวกันอาจเกิดขึ้นในนิพจน์อื่น ๆ เช่นการดำเนินการทางคณิตศาสตร์:

               
    print 4 + 7 $var;

    PHP ไม่สามารถคาดเดาได้ที่นี่หากตัวแปรควรถูกเพิ่มลบออกหรือเปรียบเทียบ ฯลฯ

  4. รายการ

    เช่นเดียวกับรายการไวยากรณ์เช่นในประชากรอาร์เรย์ซึ่ง parser ยังระบุเครื่องหมายจุลภาค,ตัวอย่างเช่น:

                                          
    $var = array("1" => $val, $val2, $val3 $val4);

    หรือรายการพารามิเตอร์ฟังก์ชั่น:

                                    
    function myfunc($param1, $param2 $param3, $param4)

    คุณเห็นสิ่งนี้อย่างเท่าเทียมกับlistหรือglobalข้อความหรือเมื่อขาด;เครื่องหมายอัฒภาคในforลูป

  5. ประกาศคลาส

    ข้อผิดพลาด parser นี้ยังเกิดขึ้นในการประกาศคลาส คุณสามารถกำหนดค่าคงที่แบบคงที่เท่านั้นไม่ใช่แบบนิพจน์ ดังนั้นตัวแยกวิเคราะห์บ่นเกี่ยวกับตัวแปรตามข้อมูลที่กำหนด:

    class xyz {      
        var $value = $_GET["input"];

    ที่ไม่มีใครเทียบ}ปิดวงเล็บปีกกาสามารถในการเป็นผู้นำโดยเฉพาะอย่างยิ่งที่นี่ หากวิธีการถูกยกเลิกเร็วเกินไป (ใช้การเยื้องที่เหมาะสม!) แล้วตัวแปรเร่ร่อนมักถูกใส่ผิดที่ในคลาสการประกาศคลาส

  6. ตัวแปรหลังจากตัวระบุ

    คุณยังไม่สามารถมีตัวแปรตามตัวระบุได้โดยตรง:

                 
    $this->myFunc$VAR();

    Btw นี้เป็นตัวอย่างที่พบที่ตั้งใจที่จะใช้ตัวแปรตัวแปรบางที ในกรณีนี้การค้นหาคุณสมบัติตัวแปรด้วย$this->{"myFunc$VAR"}();เช่น

    โปรดทราบว่าการใช้ตัวแปรตัวแปรควรเป็นข้อยกเว้น ผู้มาใหม่มักจะพยายามใช้อย่างไม่เป็นทางการแม้เมื่ออาร์เรย์จะง่ายและเหมาะสมกว่าก็ตาม

  7. ไม่พบเครื่องหมายวงเล็บในการสร้างภาษา

    พิมพ์รีบร้อนอาจนำไปสู่การเปิดลืมหรือวงเล็บปิดสำหรับifและforและforeachงบ:

           
    foreach $array as $key) {

    การแก้ไข: เพิ่มการเปิดที่หายไป(ระหว่างคำสั่งและตัวแปร

                          
    if ($var = pdo_query($sql) {
         $result = 

    หยิก{รั้งไม่เปิดการป้องกันรหัส, โดยไม่ต้องปิดifการแสดงออกที่มี)วงเล็บปิดแรก

  8. อื่นไม่คาดหวังเงื่อนไข

         
    else ($var >= 0)

    วิธีแก้ไข: ลบเงื่อนไขจากหรือการใช้งานelseelseif

  9. ต้องใช้วงเล็บปิด

         
    function() uses $var {}

    การแก้ไข: $varเพิ่มวงเล็บรอบ

  10. ช่องว่างที่มองไม่เห็น

    ดังที่กล่าวไว้ในคำตอบอ้างอิงของ "Invisible Stray Unicode" (เช่นช่องว่างที่ไม่ทำลาย ) คุณอาจเห็นข้อผิดพลาดนี้สำหรับรหัสที่ไม่สงสัยเช่น:

    <?php
                              
    $var = new PDO(...);

    มันค่อนข้างแพร่หลายในการเริ่มต้นของไฟล์และสำหรับรหัสคัดลอกและวาง ตรวจสอบกับ hexeditor หากรหัสของคุณไม่ปรากฏว่ามีปัญหาด้านไวยากรณ์

ดูสิ่งนี้ด้วย


32

T_CONSTANT_ENCAPSED_STRING ที่
ไม่คาดคิด T_ENCAPSED_AND_WHITESPACE ที่ไม่คาดคิด

ชื่อเทอะทะT_CONSTANT_ENCAPSED_STRINGและT_ENCAPSED_AND_WHITESPACEอ้างถึงอ้างตัวอักษร"string"

พวกเขาจะใช้ในบริบทที่แตกต่างกัน แต่ปัญหาไวยากรณ์ค่อนข้างคล้ายกัน T_ENCAPSED ...คำเตือนเกิดขึ้นในบริบทสตริงที่ยกมาสองครั้งในขณะที่T_CONSTANT ...สตริงมักจะหลงทางในการแสดงออก PHP หรือคำสั่งธรรมดา

  1. การแก้ไขตัวแปรไม่ถูกต้อง

    และพบบ่อยที่สุดสำหรับการแก้ไขตัวแปร PHP ที่ไม่ถูกต้อง:

                                   
    echo "Here comes a $wrong['array'] access";

    คีย์การอ้างถึงอาร์เรย์จำเป็นต้องอยู่ในบริบท PHP แต่ในสตริงที่ยกมาสองครั้ง (หรือ HEREDOCs) นี้เป็นข้อผิดพลาด parser บ่นเกี่ยวกับการอ้างอิงเดียวที่มีอยู่'string'เพราะมักจะคาดหวังว่าตัวอักษร / คีย์ที่แท้จริงมี

    แม่นยำยิ่งขึ้นที่จะใช้ไวยากรณ์ง่าย ๆสไตล์ PHP2 ภายในเครื่องหมายคำพูดคู่สำหรับการอ้างอิงอาร์เรย์:

    echo "This is only $valid[here] ...";

    อาร์เรย์ที่ซ้อนกันหรือการอ้างอิงวัตถุที่ลึกกว่านั้นต้องการไวยากรณ์นิพจน์สตริงหยิกที่ซับซ้อน :

    echo "Use {$array['as_usual']} with curly syntax.";

    หากไม่แน่ใจนี่เป็นวิธีที่ปลอดภัยกว่าในการใช้งาน มันมักจะถือว่าอ่านได้มากขึ้น และ IDE ที่ดีกว่าใช้การสร้างสีให้กับไวยากรณ์ที่แตกต่างกัน

  2. ไม่มีการต่อข้อมูล

    หากสตริงตามนิพจน์ แต่ขาดการต่อข้อมูลหรือตัวดำเนินการอื่นคุณจะเห็น PHP บ่นเกี่ยวกับตัวอักษรของสตริง:

                           
    print "Hello " . WORLD  " !";

    ในขณะที่คุณและฉันเห็นได้ชัด PHP ก็ไม่สามารถคาดเดาได้ว่าสตริงนั้นควรถูกผนวกเข้าที่นั่น

  3. ความสับสนในการใส่สตริงข้อความ

    ข้อผิดพลาดไวยากรณ์เดียวกันเกิดขึ้นเมื่อรบกวนคั่นสตริง สตริงเริ่มต้นด้วยคำพูดเดียว'หรือสองครั้ง"ก็จบลงด้วยการเดียวกัน

                    
    print "<a href="' . $link . '">click here</a>";
          ⌞⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟⌞⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⌟

    ตัวอย่างนั้นเริ่มต้นด้วยเครื่องหมายคำพูดคู่ แต่เครื่องหมายคำพูดคู่นั้นถูกกำหนดไว้สำหรับแอตทริบิวต์ HTML ผู้ประกอบการเชื่อมต่อที่ตั้งใจไว้ภายในอย่างไรก็ตามกลายเป็นตีความเป็นส่วนหนึ่งของสตริงที่สองในคำพูดเดียว

    เคล็ดลับ : ตั้งค่าตัวแก้ไข / IDE ของคุณให้ใช้การปรับสีที่แตกต่างกันเล็กน้อยสำหรับสตริงที่ยกมาเดี่ยวและคู่ (นอกจากนี้ยังช่วยในการใช้ตรรกะของแอปพลิเคชันเพื่อเลือกเช่นสตริงที่ยกมาสองครั้งสำหรับการส่งข้อความต้นฉบับและสตริงที่ยกมาเดียวสำหรับค่าคงที่เหมือนกันเท่านั้น)

    นี่เป็นตัวอย่างที่ดีที่คุณไม่ควรแยกคำพูดออกเป็นสองเท่าในตอนแรก ให้ใช้การ\"หลีกหนีที่เหมาะสมสำหรับเครื่องหมายคำพูดของคุณสมบัติ HTML:

    print "<a href=\"{$link}\">click here</a>";

    ในขณะที่สิ่งนี้สามารถนำไปสู่ความสับสนทางไวยากรณ์ IDEs / บรรณาธิการที่ดีขึ้นทั้งหมดช่วยอีกครั้งโดย colorizing คำพูดที่หนีออกมาแตกต่างกัน

  4. ไม่มีเครื่องหมายคำพูดเปิด

    เท่าที่มีการลืมเปิด"/ 'คำพูดสูตรสำหรับข้อผิดพลาด parser นี้:

                   
     make_url(login', 'open');

    ที่นี่', 'จะกลายเป็นตัวอักษรสตริงหลังจาก bareword เมื่อเห็นได้ชัดloginว่าหมายถึงการเป็นพารามิเตอร์สตริง

  5. รายการอาร์เรย์

    หากคุณพลาด,เครื่องหมายจุลภาคในบล็อกการสร้างอาร์เรย์ตัวแยกวิเคราะห์จะเห็นสองสายติดต่อกัน:

    array(               
         "key" => "value"
         "next" => "....",
    );

    โปรดทราบว่าบรรทัดสุดท้ายอาจมีเครื่องหมายจุลภาคพิเศษอยู่เสมอ ซึ่งเป็นการยากที่จะค้นพบโดยไม่เน้นไวยากรณ์

  6. รายการพารามิเตอร์ฟังก์ชั่น

    สิ่งเดียวกันสำหรับการเรียกใช้ฟังก์ชัน :

                             
    myfunc(123, "text", "and"  "more")
  7. สตริงควบคุมไม่

    การแปรผันทั่วไปนั้นเป็นเพียงการยกเลิกสตริงตัวต่อ:

                                    
    mysql_evil("SELECT * FROM stuffs);
    print "'ok'";
          ⇑

    ที่นี่ PHP บ่นเกี่ยวกับสองตัวอักษรสตริงโดยตรงต่อกัน แต่สาเหตุที่แท้จริงคือสตริงก่อนหน้าที่ไม่ได้ถูกเปิดเผยแน่นอน

ดูสิ่งนี้ด้วย


27

ไม่คาดหวัง T_STRING

T_STRINGเป็นคนเรียกชื่อผิด "string"มันไม่ได้หมายถึงยกมา มันหมายความว่าพบตัวระบุดิบ สิ่งนี้สามารถช่วงจากbareคำที่เหลือCONSTANTหรือชื่อฟังก์ชั่นสายอักขระที่ไม่ได้ถูกลืมหรือข้อความธรรมดาใด ๆ

  1. สตริงที่อ้างถึงผิด

    ข้อผิดพลาดทางไวยากรณ์นี้เป็นเรื่องธรรมดาที่สุดสำหรับค่าสตริงที่ไม่ถูกต้องอย่างไรก็ตาม ใด ๆ ที่ไม่ใช้ค่า Escape และ stray "หรือ'quote จะทำให้เกิดนิพจน์ที่ไม่ถูกต้อง:

                                     
     echo "<a href="http://example.com">click here</a>";

    การเน้นไวยากรณ์จะทำให้ความผิดพลาดนั้นชัดเจนมาก สิ่งสำคัญคืออย่าลืมใช้แบ็กสแลชเพื่อหลีกเลี่ยง\"อัญประกาศคู่หรือ\'อัญประกาศเดี่ยว - ซึ่งขึ้นอยู่กับสิ่งที่ใช้เป็นสิ่งที่แนบสตริงตู้สตริง

    • เพื่อความสะดวกคุณควรเลือกอัญประกาศเดี่ยวภายนอกเมื่อแสดง HTML ธรรมดาที่มีเครื่องหมายคำพูดคู่อยู่ภายใน
    • ใช้สตริงที่มีเครื่องหมายคำพูดคู่หากคุณต้องการแก้ไขตัวแปร แต่ให้ระวังการหลีกเลี่ยงตัวอักษร "เครื่องหมายคำพูดคู่คำพูดคู่ที่
    • สำหรับเอาต์พุตที่ยาวกว่าให้เลือกหลาย ๆบรรทัดecho/ printแทนการหลีกเลี่ยงการเข้าและออก ควรพิจารณาส่วนHEREDOCให้ดีขึ้น

    อีกตัวอย่างหนึ่งคือการใช้รายการ PHP ภายในโค้ด HTML ที่สร้างด้วย PHP:

    $text = '<div>some text with <?php echo 'some php entry' ?></div>'

    สิ่งนี้จะเกิดขึ้นหาก$textมีขนาดใหญ่ที่มีหลายบรรทัดและผู้พัฒนาไม่เห็นค่าตัวแปร PHP ทั้งหมดและมุ่งเน้นไปที่ส่วนของโค้ดที่ลืมเกี่ยวกับแหล่งที่มา ตัวอย่างคือที่นี่

    ดูเพิ่มเติมอะไรคือความแตกต่างระหว่างสตริงที่มีการเสนอราคาเดี่ยวและสองครั้งใน PHP? .

  2. สตริงที่ไม่เปิดเผย

    หากคุณพลาดการปิด"ดังนั้นข้อผิดพลาดทางไวยากรณ์มักจะเกิดขึ้นในภายหลัง สตริงที่ไม่ถูกทำลายมักจะใช้รหัสเล็กน้อยจนกว่าค่าสตริงที่กำหนดไว้ถัดไป:

                                                           
    echo "Some text", $a_variable, "and some runaway string ;
    success("finished");
             ⇯

    มันไม่ใช่แค่ตัวอักษรT_STRINGที่ parser อาจประท้วงในขณะนั้น อีกรูปแบบที่พบบ่อยคือUnexpected '>'HTML ที่ไม่มีการอ้างอิง

  3. อัญประกาศสตริงที่ไม่ใช่โปรแกรมมิง

    หากคุณคัดลอกและวางรหัสจากบล็อกหรือเว็บไซต์บางครั้งคุณอาจใช้รหัสที่ไม่ถูกต้อง คำพูดที่เกี่ยวกับวิชาการพิมพ์ไม่ใช่สิ่งที่ PHP คาดหวัง:

    $text = Something something..’ + these ain't quotes”;

    การอ้างถึงตัวอักษร / สมาร์ทเป็นสัญลักษณ์ Unicode PHP ถือว่ามันเป็นส่วนหนึ่งของข้อความตัวอักษรและตัวเลขที่อยู่ติดกัน ตัวอย่างเช่น”theseตีความว่าเป็นตัวระบุคงที่ แต่ข้อความใด ๆ ที่ตามมาจะถูกมองว่าเป็นตัวแปลคำ / T_STRING โดย parser

  4. อัฒภาคที่หายไป; อีกครั้ง

    หากคุณมีนิพจน์ที่ไม่ถูกทำลายในบรรทัดก่อนหน้าคำสั่งหรือการสร้างภาษาใด ๆ ต่อไปนี้จะถูกมองว่าเป็นตัวระบุดิบ:

           
    func1()
    function2();

    PHP ไม่สามารถรู้ได้ว่าคุณตั้งใจจะรันสองฟังก์ชันหลังจากที่อื่นหรือถ้าคุณตั้งใจที่จะคูณผลลัพธ์ของพวกเขาเพิ่มเพิ่มเปรียบเทียบหรือเรียกใช้อย่างใดอย่างหนึ่ง||เท่านั้น

  5. แท็กและ<?xmlส่วนหัวสั้นแบบเปิดในสคริปต์ PHP

    นี่เป็นเรื่องแปลก แต่ถ้าเปิดใช้งาน short_open_tags คุณจะไม่สามารถเริ่มต้นสคริปต์ PHP ด้วยการประกาศ XML :

          
    <?xml version="1.0"?>

    PHP จะเห็น<?และเรียกคืนมันเอง มันจะไม่เข้าใจสิ่งที่xmlมีความหมายหลงทาง มันจะถูกตีความว่าเป็นค่าคงที่ แต่versionจะถูกมองว่าเป็นตัวอักษร / คงที่อื่น และเนื่องจากตัวแยกวิเคราะห์ไม่สามารถเข้าใจถึงตัวอักษร / ค่าสองตัวต่อมาที่ไม่มีตัวดำเนินการนิพจน์

  6. อักขระ Unicode ที่มองไม่เห็น

    สาเหตุน่าเกลียดมากที่สุดสำหรับข้อผิดพลาดไวยากรณ์เป็นสัญลักษณ์ Unicode เช่นพื้นที่ที่ไม่ได้หมด PHP อนุญาตให้ใช้อักขระ Unicode เป็นชื่อตัวระบุ หากคุณได้รับการแยกวิเคราะห์ T_STRING สำหรับรหัสที่ไม่น่าสงสัยอย่างเช่น:

    <?php
        print 123;

    คุณต้องแบ่งเท็กซ์เอดิเตอร์อื่นออก หรือเลขฐานสิบหกได้ ดูเหมือนว่าช่องว่างธรรมดาและบรรทัดใหม่ที่นี่อาจมีค่าคงที่ที่มองไม่เห็น IDEs ที่ใช้ Java บางครั้งอาจลืมไปที่ UTF-8 BOM ที่อยู่ภายในช่องว่างที่มีความกว้างเป็นศูนย์ตัวคั่นย่อหน้า ฯลฯ พยายามที่จะทำการแก้ไขทุกอย่างลบช่องว่างและเพิ่มช่องว่างปกติกลับเข้ามา

    คุณสามารถ จำกัด ให้แคบลงด้วยการเพิ่ม;ตัวคั่นคำสั่งซ้ำซ้อนในแต่ละบรรทัดที่เริ่มต้น:

    <?php
        ;print 123;

    ;เครื่องหมายอัฒภาคพิเศษที่นี่จะแปลงอักขระที่มองไม่เห็นก่อนหน้านี้เป็นการอ้างอิงค่าคงที่ที่ไม่ได้กำหนด (นิพจน์เป็นคำสั่ง) ซึ่งในทางกลับกันทำให้ PHP สร้างประกาศที่เป็นประโยชน์

  7. เครื่องหมาย `$ 'หายไปด้านหน้าชื่อตัวแปร

    ตัวแปรใน PHPแสดงด้วยเครื่องหมายดอลลาร์ตามด้วยชื่อของตัวแปร

    เครื่องหมายดอลลาร์ ( $) เป็นเครื่องหมายที่ทำเครื่องหมายตัวระบุว่าเป็นชื่อของตัวแปร โดยไม่ต้องเครื่องหมายนี้ระบุอาจเป็นคำหลักภาษาหรือคงที่

    นี่เป็นข้อผิดพลาดทั่วไปเมื่อรหัส PHP ถูก"แปล" จากรหัสที่เขียนในภาษาอื่น (C, Java, JavaScript, ฯลฯ ) ในกรณีเช่นนี้การประกาศประเภทตัวแปร (เมื่อรหัสต้นฉบับถูกเขียนในภาษาที่ใช้ตัวแปรที่พิมพ์) อาจแอบออกมาและทำให้เกิดข้อผิดพลาดนี้

  8. เครื่องหมายคำพูดที่หนี

    หากคุณใช้\ในสตริงมันมีความหมายพิเศษ สิ่งนี้เรียกว่า " Escape Character " และโดยปกติจะบอกให้โปรแกรมแยกวิเคราะห์ใช้อักขระตัวถัดไปอย่างแท้จริง

    ตัวอย่าง: echo 'Jim said \'Hello\'';จะพิมพ์Jim said 'hello'

    หากคุณหลีกเลี่ยงอัญประกาศปิดของสตริงอัญประกาศปิดจะถูกนำมาใช้ตามตัวอักษรและไม่เป็นไปตามที่ตั้งใจไว้เช่นเป็นคำพูดที่พิมพ์ได้เป็นส่วนหนึ่งของสตริงและไม่ปิดสตริง สิ่งนี้จะแสดงเป็นข้อผิดพลาดในการแยกวิเคราะห์โดยทั่วไปหลังจากที่คุณเปิดสตริงถัดไปหรือในตอนท้ายของสคริปต์

    ข้อผิดพลาดทั่วไปมากเมื่อระบุพา ธ ใน Windows: "C:\xampp\htdocs\"ผิด "C:\\xampp\\htdocs\\"คุณจำเป็นต้อง


18

ไม่คาดฝัน (

โดยทั่วไปการเปิดวงเล็บจะเป็นไปตามโครงสร้างภาษาเช่นif/ foreach/ for/ array/ listหรือเริ่มการแสดงออกทางคณิตศาสตร์ พวกเขาจะไม่ถูกต้อง syntactically หลังจาก"strings"ก่อนหน้า()เดียว$และในบริบทการประกาศทั่วไปบางอย่าง

  1. พารามิเตอร์การประกาศฟังก์ชั่น

    เกิดขึ้นยากสำหรับข้อผิดพลาดนี้พยายามที่จะใช้การแสดงออกเป็นพารามิเตอร์ฟังก์ชั่นเริ่มต้น สิ่งนี้ไม่ได้รับการสนับสนุนแม้ใน PHP7:

    function header_fallback($value, $expires = time() + 90000) {

    พารามิเตอร์ในการประกาศฟังก์ชันสามารถเป็นค่าตามตัวอักษรหรือนิพจน์คงที่เท่านั้น ไม่เหมือนกับการเรียกใช้ฟังก์ชันที่คุณสามารถใช้งานได้อย่างอิสระwhatever(1+something()*2)ฯลฯ

  2. ค่าเริ่มต้นของคุณสมบัติคลาส

    สิ่งเดียวกันสำหรับการประกาศสมาชิกชั้นเรียนที่อนุญาตให้ใช้เฉพาะค่าตัวอักษร / ค่าคงที่เท่านั้นไม่ใช่นิพจน์:

    class xyz {                   
        var $default = get_config("xyz_default");

    ใส่สิ่งต่าง ๆ ลงในตัวสร้าง ดูเพิ่มเติมทำไมแอตทริบิวต์ PHP ไม่อนุญาตให้มีฟังก์ชั่น

    โปรดทราบอีกครั้งว่า PHP 7 อนุญาตเฉพาะvar $xy = 1 + 2 +3;การแสดงค่าคงที่เท่านั้น

  3. ไวยากรณ์ JavaScript ใน PHP

    การใช้ JavaScript หรือไวยากรณ์ jQueryจะไม่ทำงานใน PHP ด้วยเหตุผลที่ชัดเจน:

    <?php      
        print $(document).text();

    เมื่อสิ่งนี้เกิดขึ้นมันมักจะบ่งชี้สตริงก่อนหน้านี้ที่ไม่ถูกทำลาย และ<script>ส่วนตามตัวอักษรรั่วเข้าไปในบริบทรหัส PHP

  4. isset (()), ว่างเปล่า, คีย์, ถัดไป, ปัจจุบัน

    ทั้งสองisset()และempty()เป็นภาษาในตัวไม่ใช่ฟังก์ชั่น พวกเขาจำเป็นต้องเข้าถึงตัวแปรโดยตรง หากคุณเพิ่มวงเล็บโดยไม่ได้ตั้งใจมากเกินไปคุณควรสร้างนิพจน์ดังนี้:

              
    if (isset(($_GET["id"]))) {

    เช่นเดียวกับการสร้างภาษาใด ๆ ที่ต้องการการเข้าถึงชื่อตัวแปรโดยนัย บิวด์อินเหล่านี้เป็นส่วนหนึ่งของไวยากรณ์ภาษาดังนั้นจึงไม่อนุญาตให้ใส่วงเล็บเสริม

    ฟังก์ชั่นระดับผู้ใช้ที่ต้องการการอ้างอิงตัวแปร - แต่รับผลการแสดงออกผ่านไปสู่ข้อผิดพลาดรันไทม์แทน


ไม่คาดฝัน )

  1. ไม่มีฟังก์ชันพารามิเตอร์

    คุณไม่สามารถมีจรจัดจุลภาคสุดท้ายในการเรียกใช้ฟังก์ชัน PHP คาดว่าค่าจะมีและบ่นเกี่ยวกับ)วงเล็บปิดเร็ว

                  
    callfunc(1, 2, );

    คอมม่าต่อท้ายอนุญาตให้ใช้ในarray()หรือlist()สร้างเท่านั้น

  2. นิพจน์ที่ยังไม่เสร็จ

    หากคุณลืมบางสิ่งในนิพจน์เชิงคำนวณแล้วโปรแกรมแยกวิเคราะห์จะเลิกใช้ เพราะมันควรตีความว่า:

                   
    $var = 2 * (1 + );

    และถ้าคุณลืมปิด)แม้ว่าคุณจะได้รับการร้องเรียนเกี่ยวกับอัฒภาคที่ไม่คาดคิดแทน

  3. เบื้องหน้าเช่น constant

    สำหรับคำนำหน้าตัวแปรที่ถูกลืม$ในคำสั่งควบคุมคุณจะเห็น:

                           
    foreach ($array as wrong) {

    PHP ที่นี่บางครั้งจะบอกคุณว่ามันคาดว่าจะเป็น::แทน เนื่องจากคลาส :: ตัวแปร $ สามารถทำให้นิพจน์ตัวแปร $ เป็นไปตามที่คาดไว้


ไม่คาดฝัน {

วงเล็บปีกกา{และ}ใส่บล็อครหัส และข้อผิดพลาดทางไวยากรณ์เกี่ยวกับพวกเขามักจะบ่งบอกถึงการทำรังที่ไม่ถูกต้อง

  1. นิพจน์ย่อยที่ไม่ตรงกันใน if

    ส่วนใหญ่ไม่สมดุล(และ)เป็นสาเหตุถ้า parser บ่นเกี่ยวกับการเปิดหยิก{ปรากฏเร็วเกินไป ตัวอย่างง่ายๆ:

                                  
    if (($x == $y) && (2 == true) {

    นับวงเล็บของคุณหรือใช้ IDE ที่ช่วยได้ อย่าเขียนโค้ดโดยไม่มีการเว้นวรรค จำนวนการอ่าน

  2. {และ} ในบริบทการแสดงออก

    คุณไม่สามารถใช้วงเล็บปีกกาในการแสดงออก หากคุณสับสนวงเล็บและ curlys มันจะไม่สอดคล้องกับไวยากรณ์ภาษา:

               
    $var = 5 * {7 + $x};

    มีข้อยกเว้นบางประการสำหรับการสร้างตัวระบุเช่นตัวแปรขอบเขต${references}ภายใน

  3. ตัวแปรตัวแปรหรือนิพจน์ var curly

    มันค่อนข้างหายาก แต่คุณอาจได้รับ{และ}แยกวิเคราะห์ข้อร้องเรียนสำหรับการแสดงออกของตัวแปรที่ซับซ้อน:

                          
    print "Hello {$world[2{]} !";

    แม้ว่าจะมีโอกาสสูงกว่าที่คาดไม่ถึง}ในบริบทดังกล่าว


ไม่คาดฝัน }

เมื่อได้รับ}ข้อผิดพลาด " ไม่คาดคิด" คุณส่วนใหญ่ปิดบล็อกโค้ดเร็วเกินไป

  1. คำสั่งสุดท้ายในการบล็อกรหัส

    มันสามารถเกิดขึ้นได้สำหรับการแสดงออกที่ไม่ถูก จำกัด

    และถ้าบรรทัดสุดท้ายในฟังก์ชั่น / รหัสบล็อกไม่มี;อัฒภาคต่อท้าย:

    function whatever() {
        doStuff()
    }            

    ตัวแยกวิเคราะห์ที่นี่ไม่สามารถบอกได้ว่าคุณอาจต้องการเพิ่ม+ 25;ไปยังผลลัพธ์ของฟังก์ชันหรืออย่างอื่น

  2. การซ้อนบล็อกไม่ถูกต้อง / ลืม {

    บางครั้งคุณจะเห็นข้อผิดพลาดในการแยกวิเคราะห์เมื่อบล็อกโค้ดถูก}ปิดเร็วเกินไปหรือคุณลืมเปิด{แม้:

    function doStuff() {
        if (true)    
            print "yes";
        }
    }   

    ในตัวอย่างข้างต้นifไม่มี{ปีกกาเปิด ดังนั้นการปิด}หนึ่งรายการด้านล่างจึงซ้ำซ้อน และดังนั้นการปิดครั้งต่อไป}ซึ่งมีไว้สำหรับฟังก์ชั่นนั้นไม่สามารถเชื่อมโยงกับ{วงเล็บปีกกาเปิดแบบดั้งเดิม

    ข้อผิดพลาดดังกล่าวหายากยิ่งขึ้นหากไม่มีการเยื้องรหัสที่เหมาะสม ใช้ IDE และการจับคู่วงเล็บปีกกา


คาดไม่ถึง{คาดหวัง(

ภาษาที่สร้างซึ่งต้องการส่วนหัวเงื่อนไข / การประกาศและการบล็อกรหัสจะทริกเกอร์ข้อผิดพลาดนี้

  1. รายการพารามิเตอร์

    ตัวอย่างเช่นฟังก์ชั่น misdeclared ที่ไม่มีรายการพารามิเตอร์ไม่ได้รับอนุญาต:

                     
    function whatever {
    }
  2. เงื่อนไขคำสั่งควบคุม

    และคุณไม่สามารถเช่นเดียวกันมีโดยไม่มีเงื่อนไขif

      
    if {
    }

    ซึ่งไม่สมเหตุสมผล สิ่งเดียวกันสำหรับผู้ต้องสงสัยตามปกติ, for/ foreach, while/ doฯลฯ

    หากคุณพบข้อผิดพลาดนี้คุณควรค้นหาตัวอย่างด้วยตนเอง


1
กำลังมองหาคำตอบสำหรับคำถามของฉันในโพสต์นี้ แต่พบว่าตอบตัวเองกับปัญหาของ - "ไม่คาดคิด {" นั่นคือเหตุผลที่ฉันต้องการแบ่งปันกับคำตอบของฉัน - สำหรับฉันปัญหาคือการเข้ารหัสบรรทัดแตก - อย่างใดบางอย่างของฉัน ไฟล์ถูกใช้ตัวแบ่งบรรทัดของ macintosh แต่เมื่อฉันเปลี่ยนเป็นตัวแบ่งบรรทัดของ windows - ปัญหาของฉัน (ใน localhost (WAMP) ทุกอย่างทำงานได้ แต่ใน linux webserver dont) ก็แก้ไขได้
Edgars Aivars

@EdgarsAivars ขอบคุณสำหรับความคิดเห็นของคุณ! การแพร่กระจายเฉพาะแพลตฟอร์มเป็นปัญหาที่ผิดปกติและยุ่งยาก ฉันอาจจะพูดถึงภายในที่นี่เช่นกัน (มันถูกกล่าวถึงเพียงในส่วนของคำตอบอ้างอิงอื่น ๆ )
มาริโอ

ฉันพบว่าการรับสิ่งที่ไม่คาดคิด} เป็นเพราะชิ้นส่วนของรหัสของฉันใช้แท็กสั้น php <? แทนที่จะเป็น <? php - ใช้เวลาสักครู่เพื่อค้นหาอันนี้เพราะมันทำงานบนเซิร์ฟเวอร์อื่น
c7borg

14

ไม่คาดคิด $ end

เมื่อ PHP พูดถึง "สิ่งที่ไม่คาดคิด$end" หมายความว่าโค้ดของคุณสิ้นสุดก่อนเวลาอันควร (ข้อความเป็นความเข้าใจผิดเล็กน้อยเมื่อถ่ายตามตัวอักษรมันไม่เกี่ยวกับตัวแปรที่ชื่อว่า "$ end" ซึ่งบางครั้งผู้มาใหม่สันนิษฐานว่ามันหมายถึง "จุดสิ้นสุดของไฟล์", EOF.)

สาเหตุ:ไม่สมดุล{และ}สำหรับการบล็อกโค้ด / และฟังก์ชันหรือการประกาศคลาส

มันเป็นเรื่องเกี่ยวกับวงเล็บปีกกาที่ขาดหายไปเสมอ}เพื่อปิดบล็อกโค้ดก่อนหน้า

  • อีกครั้งใช้การเยื้องที่เหมาะสมเพื่อหลีกเลี่ยงปัญหาดังกล่าว

  • ใช้ IDE ที่มีการจับคู่วงเล็บปีกกาเพื่อหาตำแหน่งที่}ผิด มีแป้นพิมพ์ลัดใน IDE และตัวแก้ไขข้อความส่วนใหญ่:

    • NetBeans, PhpStorm, Komodo: Ctrl[และCtrl]
    • Eclipse, Aptana: CtrlShiftP
    • Atom, Sublime: Ctrlm- Zend StudioCtrlM
    • Geany, Notepad ++: CtrlB- Joe: CtrlG- Emacs: C-M-n- เป็นกลุ่ม:%

IDEs ส่วนใหญ่ยังเน้นวงเล็บปีกกาวงเล็บและวงเล็บที่ตรงกัน ซึ่งทำให้ง่ายต่อการตรวจสอบความสัมพันธ์ของพวกเขา:

การจับคู่วงเล็บปีกกาใน IDE

นิพจน์ที่ไม่ถูก จำกัด

และUnexpected $endข้อผิดพลาดทางไวยากรณ์ / ตัวแยกวิเคราะห์สามารถเกิดขึ้นได้สำหรับนิพจน์หรือคำสั่งที่ไม่ได้ระบุ:

  • $var = func(1, ?>EOF

ดังนั้นดูจุดสิ้นสุดของสคริปต์ก่อน การสืบค้นกลับ;มักจะซ้ำซ้อนสำหรับคำสั่งสุดท้ายในสคริปต์ PHP ใด ๆ แต่คุณควรมี แม่นยำเพราะมันทำให้ปัญหาไวยากรณ์แคบลง

เครื่องหมาย HEREDOC ที่เยื้อง

เหตุการณ์ทั่วไปอื่นปรากฏขึ้นพร้อมกับสตริงHEREDOC หรือ NOWDOC เครื่องหมายสิ้นสุดจะถูกละเว้นด้วยช่องว่างนำแท็บ ฯลฯ :

print <<< END
    Content...
    Content....
  END;
# ↑ terminator isn't exactly at the line start

ดังนั้น parser จะใช้สตริง HEREDOC เพื่อดำเนินการต่อไปจนถึงจุดสิ้นสุดของไฟล์ ค่อนข้างมาก IDEs และบรรณาธิการเน้นไวยากรณ์จะทำให้ชัดเจนหรือเตือนเกี่ยวกับมัน

เครื่องหมายคำพูดที่หนี

หากคุณใช้\ในสตริงมันมีความหมายพิเศษ สิ่งนี้เรียกว่า " Escape Character " และโดยปกติจะบอกให้โปรแกรมแยกวิเคราะห์ใช้อักขระตัวถัดไปอย่างแท้จริง

ตัวอย่าง: echo 'Jim said \'Hello\'';จะพิมพ์Jim said 'hello'

หากคุณหลีกเลี่ยงอัญประกาศปิดของสตริงอัญประกาศปิดจะถูกนำมาใช้ตามตัวอักษรและไม่เป็นไปตามที่ตั้งใจไว้เช่นเป็นคำพูดที่พิมพ์ได้เป็นส่วนหนึ่งของสตริงและไม่ปิดสตริง สิ่งนี้จะแสดงเป็นข้อผิดพลาดในการแยกวิเคราะห์โดยทั่วไปหลังจากที่คุณเปิดสตริงถัดไปหรือในตอนท้ายของสคริปต์

ข้อผิดพลาดทั่วไปมากเมื่อระบุพา ธ ใน Windows: "C:\xampp\htdocs\"ผิด "C:\\xampp\\htdocs\\"คุณจำเป็นต้อง

ไวยากรณ์ทางเลือก

ค่อนข้าง rarer คุณสามารถเห็นข้อผิดพลาดทางไวยากรณ์นี้เมื่อใช้ไวยากรณ์ทางเลือกสำหรับบล็อกคำสั่ง / รหัสในแม่แบบ การใช้if:และelse:และหายไปendif;ตัวอย่างเช่น

ดูสิ่งนี้ด้วย:


14

ไม่คาดหวัง T_IF
ไม่คาดหวัง T_ELSEIF
ไม่คาดหวัง T_ELSE
ไม่คาดหวัง T_ENDIF

บล็อกควบคุมเงื่อนไขif, elseifและelseเป็นไปตามโครงสร้างที่เรียบง่าย เมื่อคุณพบข้อผิดพลาดทางไวยากรณ์เป็นไปได้มากที่สุดเพียงแค่การซ้อนกันบล็อกที่ไม่ถูกต้อง→ด้วย{เครื่องหมายปีกกาที่ขาดหายไป}- หรือมากเกินไป

ป้อนคำอธิบายรูปภาพที่นี่

  1. ไม่มี{หรือ}เนื่องจากการเยื้องไม่ถูกต้อง

    การจัดตำแหน่งโค้ดที่ไม่ตรงกันเป็นเรื่องปกติของโค้ดที่มีการจัดรูปแบบที่น้อยกว่าเช่น:

    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 ที่ไม่สามารถอ่านได้

  2. 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ภายในการต่อสตริง / นิพจน์

    คุณจะต้องใช้งานที่ได้รับมอบหมายในบล็อครหัส :

    if ($x == $y) { $var = "true"; }

    อีกทางเลือกหนึ่งรีสอร์ทเพื่อการ?:เปรียบเทียบแบบไตรภาค

    ถ้าในถ้า

    คุณไม่สามารถซ้อนifเงื่อนไขภายใน:

                        
    if ($x == true and (if $y != false)) { ... }

    ซึ่งเห็นได้ชัดว่าซ้ำซ้อนเพราะand(หรือor) แล้วอนุญาตให้เปรียบเทียบการผูกมัด

  3. ;อัฒภาคที่ถูกลืม

    อีกครั้ง: แต่ละกลุ่มควบคุมจะต้องมีคำสั่ง หากชิ้นส่วนรหัสก่อนหน้าไม่ได้ถูกยกเลิกด้วยเครื่องหมายอัฒภาคนั่นเป็นข้อผิดพลาดทางไวยากรณ์ที่รับประกันได้:

                    
    $var = 1 + 2 + 3
    if (true) {  }

    Btw บรรทัดสุดท้ายในการ{…}บล็อกโค้ดต้องใช้เครื่องหมายอัฒภาคด้วย

  4. อัฒภาคเร็วเกินไป

    ตอนนี้อาจผิดที่จะตำหนิรูปแบบการเข้ารหัสเฉพาะเนื่องจากข้อผิดพลาดนี้ง่ายเกินไปที่จะมองข้าม:

                
    if ($x == 5);
    {
        $y = 7;
    }
    else           
    {
        $x = -1;    
    }

    ซึ่งเกิดขึ้นบ่อยกว่าที่คุณคิด

    • เมื่อคุณยุติการif ()แสดงออกด้วย;มันจะดำเนินการเป็นโมฆะคำสั่ง ;กลายเป็นที่ว่างเปล่า{}ของตัวเอง!
    • {…}บล็อกจึงถูกถอดออกจากifและจะทำงานเสมอ
    • ดังนั้นจึงelseไม่มีความเกี่ยวข้องกับโครงสร้างแบบเปิดอีกต่อไปifซึ่งเป็นสาเหตุที่สิ่งนี้จะนำไปสู่ข้อผิดพลาดทางไวยากรณ์ที่ไม่คาดคิดของ T_ELSE

    ซึ่งยังอธิบายถึงรูปแบบที่ลึกซึ้งของข้อผิดพลาดทางไวยากรณ์นี้เช่นกัน:

    if ($x) { x_is_true(); }; else { something_else(); };

    ในกรณีที่;หลังจากบล็อกรหัส{…}สิ้นสุดการif สร้างทั้งหมดการelseแยกสาขาวากยสัมพันธ์

  5. ไม่ได้ใช้บล็อคโค้ด

    มันได้รับอนุญาต syntactically ที่จะละเว้นวงเล็บปีกกา{}สำหรับบล็อกรหัสในif/ elseif/ elseสาขา ซึ่งน่าเศร้าเป็นรูปแบบไวยากรณ์ที่พบบ่อยมากในการเขียนโคลง (ภายใต้สมมติฐานที่ผิดนี่เป็นการพิมพ์หรืออ่านที่เร็วกว่า)

    อย่างไรก็ตามมีแนวโน้มสูงที่จะศึกษาไวยากรณ์ แถลงการณ์เพิ่มเติมไม่ช้าก็เร็วจะหาทางเข้าไปในสาขา if / else:

    if (true)
        $x = 5;
    elseif (false)
        $x = 6;
        $y = 7;     
    else
        $z = 0;

    แต่จริงๆแล้วการใช้บล็อคโค้ดคุณต้องเขียน{... }พวกมันเช่นนั้น!

    แม้แต่โปรแกรมเมอร์ที่มีประสบการณ์ยังสามารถหลีกเลี่ยงไวยากรณ์ที่ไม่มีที่สิ้นสุดหรืออย่างน้อยก็เข้าใจว่าเป็นข้อยกเว้นพิเศษสำหรับกฎนี้

  6. Else / Elseif ผิดลำดับ

    สิ่งหนึ่งที่ต้องเตือนตัวเองเป็นคำสั่งซื้อตามเงื่อนไขของหลักสูตร

    if ($a) {  }
    else {  }
    elseif ($b) {  }
    

    คุณสามารถมีได้มากelseifเท่าที่คุณต้องการ แต่elseต้องไปให้ได้ นั่นเป็นเพียงวิธี

  7. ประกาศคลาส

    ในฐานะที่เป็นที่กล่าวถึงข้างต้นคุณไม่สามารถมีงบการควบคุมในการประกาศคลาส:

    class xyz {
        if (true) {
            function ($var) {}
        }

    คุณอาจลืมคำจำกัดความของฟังก์ชั่นหรือปิดอย่างใดอย่างหนึ่ง}เร็วเกินไปในกรณีดังกล่าว

  8. ไม่คาดหวัง 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 ศัพท์ขอบเขตปลายที่เพื่อให้มีจุดไม่มีโครงสร้างเพื่อดำเนินการต่อelseforeach}if

  9. T_ENDIF

    หาก T_ENDIF ที่ไม่คาดคิดจะบ่นเกี่ยวกับว่าคุณกำลังใช้รูปแบบไวยากรณ์ทางเลือกif:elseif:⋯ ⋯else: endif;ซึ่งคุณควรคิดอย่างรอบคอบเกี่ยวกับสองครั้ง

    • อันตรายร่วมกันสับสน eerily คล้าย:ลำไส้ใหญ่สำหรับ;อัฒภาค (ครอบคลุมใน "เซมิโคลอนเร็วเกินไป")

    • ในฐานะที่เป็นเยื้องยากที่จะติดตามในแฟ้มแม่แบบมากขึ้นเมื่อใช้ไวยากรณ์ทางเลือก - มันเป็นไปได้ของคุณไม่ตรงกับendif;if:

    • ใช้} endif; เป็นสองเท่า if -terminator

    ในขณะที่ "$ end ที่ไม่คาดคิด" มักเป็นราคาสำหรับการ}ดัดลอนแบบปิดที่ถูกลืม

  10. การบ้านและการเปรียบเทียบ

    ดังนั้นนี่ไม่ใช่ข้อผิดพลาดทางไวยากรณ์ แต่ควรกล่าวถึงในบริบทนี้:

           
    if ($x = true) { }
    else { do_false(); }

    นั่นไม่ใช่==/ ===การเปรียบเทียบ แต่=ที่ได้รับมอบหมาย สิ่งนี้ค่อนข้างบอบบางและจะทำให้ผู้ใช้บางคนแก้ไขบล็อกเงื่อนไขทั้งหมดได้อย่างไร้ประโยชน์ ระวังการมอบหมายที่ไม่ได้ตั้งใจก่อน - เมื่อใดที่คุณประสบกับข้อผิดพลาดทางตรรกะ / การกระทำผิด


11

ที่ไม่คาดคิด T_IS_EQUAL
ที่ไม่คาดคิด T_IS_GREATER_OR_EQUAL
ที่ไม่คาดคิด T_IS_IDENTICAL
ที่ไม่คาดคิด T_IS_NOT_EQUAL
T_IS_NOT_IDENTICAL ที่ไม่คาดคิด
T_IS_SMALLER_OR_EQUAL ที่ไม่คาดคิด
ที่ไม่คาดคิด<
ที่ไม่คาดคิด>

ดำเนินการเปรียบเทียบเช่น==, >=, ===, !=, <>, !==และ<=หรือ<และ>ส่วนใหญ่ควรจะใช้เพียงในการแสดงออกเช่นifการแสดงออก หาก parser บ่นเกี่ยวกับพวกเขาก็มักจะหมายถึงการ paring ที่ไม่ถูกต้องหรือ( )parens ที่ไม่ตรงกันรอบตัวพวกเขา

  1. การจัดกลุ่ม parens

    โดยเฉพาะอย่างยิ่งสำหรับifข้อความที่มีการเปรียบเทียบหลายรายการคุณต้องระมัดระวังในการนับการเปิดและปิดวงเล็บอย่างถูกต้อง:

                            
    if (($foo < 7) && $bar) > 5 || $baz < 9) { ... }
                          

    นี่คือifเงื่อนไขที่นี่ถูกยกเลิกไปแล้วโดย)

    เมื่อการเปรียบเทียบของคุณซับซ้อนเพียงพอก็มักจะช่วยแยกมันออกเป็นหลาย ๆ โครงสร้างและซ้อนกันifแทน

  2. isset () บดด้วยการเปรียบเทียบ

    ผู้ใช้ใหม่ที่พบบ่อยคือ pitfal กำลังพยายามรวมisset()หรือempty()เปรียบเทียบ:

                            
    if (empty($_POST["var"] == 1)) {

    หรือแม้กระทั่ง:

                        
    if (isset($variable !== "value")) {

    สิ่งนี้ไม่สมเหตุสมผลกับ PHP เพราะissetและemptyเป็นโครงสร้างภาษาที่ยอมรับเฉพาะชื่อตัวแปรเท่านั้น มันไม่มีเหตุผลที่จะเปรียบเทียบผลลัพธ์เช่นกันเพราะเอาต์พุตเป็นบูลีนเท่านั้น

  3. สับสน>=มากขึ้นหรือเท่ากันกับ=>ผู้ประกอบการอาร์เรย์

    ตัวดำเนินการทั้งสองมีลักษณะค่อนข้างคล้ายกันดังนั้นบางครั้งพวกเขาก็ปะปนกัน:

             
    if ($var => 5) { ... }

    คุณต้องจำไว้ว่าตัวดำเนินการเปรียบเทียบนี้เรียกว่า " มากกว่าหรือเท่ากับ " เพื่อทำให้ถูกต้อง

    ดูเพิ่มเติม: ถ้าโครงสร้างคำสั่งใน PHP

  4. ไม่มีอะไรที่จะเปรียบเทียบกับ

    คุณไม่สามารถรวมการเปรียบเทียบสองรายการได้หากพวกเขาเกี่ยวข้องกับชื่อตัวแปรเดียวกัน:

                     
    if ($xyz > 5 and < 100)

    PHP ไม่สามารถอนุมานได้ว่าคุณหมายถึงการเปรียบเทียบตัวแปรเริ่มต้นอีกครั้ง นิพจน์จะถูกจับคู่ตามความสำคัญของโอเปอเรเตอร์ดังนั้นเมื่อถึงเวลาที่<เห็นจะมีเพียงผลลัพธ์บูลีนที่เหลือจากตัวแปรดั้งเดิม

    ดูเพิ่มเติมที่: T_IS_SMALLER_OR_EQUAL ที่ไม่คาดคิด

  5. โซ่เปรียบเทียบ

    คุณไม่สามารถเปรียบเทียบกับตัวแปรด้วยแถวของโอเปอเรเตอร์:

                      
     $reult = (5 < $x < 10);

    สิ่งนี้จะต้องแยกออกเป็นสองการเปรียบเทียบแต่ละ$xข้อ

    นี่เป็นกรณีของนิพจน์ที่ขึ้นบัญชีดำ (เนื่องจากความสัมพันธ์ของตัวดำเนินการเทียบเท่า) มีความถูกต้องทางไวยากรณ์ในภาษา C-style บางภาษา แต่ PHP จะไม่ตีความว่าเป็นสายการเปรียบเทียบที่คาดหวังเช่นกัน

  6. ไม่>
    คาดหวัง<

    ผู้ประกอบการที่มากกว่า>หรือน้อยกว่า<ไม่มีT_XXXชื่อโทเค็นไนเซอร์ที่กำหนดเอง และในขณะที่พวกเขาสามารถถูกวางผิดเช่นเดียวกับพวกเขาคนอื่น ๆ คุณมักจะเห็น parser บ่นเกี่ยวกับพวกเขาสำหรับสตริงผิดและ HTML บด:

                            
    print "<a href='z">Hello</a>";
                     ↑

    จำนวนนี้เป็นสตริงที่"<a href='z"ถูกเปรียบเทียบ>กับค่าคงที่ตัวอักษรHelloแล้ว<เปรียบเทียบอีกค่า หรืออย่างน้อย PHP ก็เห็นมัน สาเหตุที่แท้จริงและความผิดพลาดทางไวยากรณ์คือการ"ยกเลิกสตริงก่อนวัยอันควร

    คุณไม่สามารถซ้อนแท็กเริ่มต้นของ PHP ได้:

    <?php echo <?php my_func(); ?>

ดูสิ่งนี้ด้วย:


11

ไม่คาดหวัง T_IF
ไม่คาดหวัง T_FOREACH
ไม่คาดหวัง T_FOR
ไม่คาดหวัง T_WHILE
ไม่คาดหวัง T_DO
ไม่คาดคิด T_ECHO

ควบคุมการสร้างเช่นif, foreach, for, while, list, global, return, do, print, echoอาจจะใช้เป็นงบเท่านั้น พวกเขามักจะอยู่ในบรรทัดด้วยตัวเอง

  1. อัฒภาค; คุณอยู่ที่ไหน

    คุณพลาดเซมิโคลอนในบรรทัดก่อนหน้าไปแล้วในระดับสากลถ้าตัวแยกวิเคราะห์บ่นเกี่ยวกับคำสั่งควบคุม:

                 
    $x = myfunc()
    if (true) {

    การแก้ไข: ดูที่บรรทัดก่อนหน้า; เพิ่มเครื่องหมายอัฒภาค

  2. ประกาศคลาส

    สถานที่ที่เกิดขึ้นนี้ก็คือในการประกาศคลาส ในส่วนของคลาสคุณสามารถแสดงรายการการเริ่มต้นคุณสมบัติเท่านั้นและส่วนของวิธีการ อาจไม่มีรหัสอยู่

    class xyz {
        if (true) {}
        foreach ($var) {}

    ข้อผิดพลาดดังกล่าวไวยากรณ์ทั่วไปเป็นรูปธรรมสำหรับซ้อนกันอย่างไม่ถูกต้องและ{ }โดยเฉพาะอย่างยิ่งเมื่อบล็อกโค้ดฟังก์ชันปิดเร็วเกินไป

  3. งบในบริบทการแสดงออก

    โครงสร้างภาษาส่วนใหญ่สามารถใช้เป็นข้อความสั่งเท่านั้น พวกเขาไม่ได้ตั้งใจที่จะอยู่ในการแสดงออกอื่น ๆ :

                       
    $var = array(1, 2, foreach($else as $_), 5, 6);

    ในทำนองเดียวกันคุณไม่สามารถใช้ifในสตริงนิพจน์ทางคณิตศาสตร์หรือที่อื่น ๆ :

                   
    print "Oh, " . if (true) { "you!" } . " won't work";
    // Use a ternary condition here instead, when versed enough.

    สำหรับifเงื่อนไขที่คล้ายการฝังในนิพจน์โดยเฉพาะคุณมักต้องการใช้การ?:ประเมินแบบไตรภาค

    เช่นเดียวกับfor, while, global, และเลสเบี้ยนขยายecholist

              
    echo 123, echo 567, "huh?";

    โดยที่print()เป็นภาษาในตัวที่อาจใช้ในบริบทของนิพจน์ (แต่ไม่ค่อยสมเหตุสมผล)

  4. คำหลักที่สงวนไว้เป็นตัวระบุ

    คุณไม่สามารถใช้doหรือifสร้างภาษาอื่น ๆ สำหรับฟังก์ชั่นที่ผู้ใช้กำหนดหรือชื่อคลาส (บางทีใน PHP 7 แต่ถึงอย่างนั้นก็ไม่แนะนำให้เลือก)


7

ไม่คาดหวัง '?'

หากคุณพยายามใช้ตัวดำเนินการรวมศูนย์??ในรุ่น PHP ก่อนหน้า PHP 7 คุณจะได้รับข้อผิดพลาดนี้

<?= $a ?? 2; // works in PHP 7+
<?= (!empty($a)) ? $a : 2; // All versions of PHP

ไม่คาดหวัง '?' คาดหวังว่าตัวแปร

ข้อผิดพลาดที่คล้ายกันสามารถเกิดขึ้นได้สำหรับประเภท nullable เช่นใน:

function add(?int $sum): ?int {

อีกครั้งซึ่งบ่งชี้ว่า PHP รุ่นเก่าถูกนำมาใช้ (ทั้งรุ่น CLI php -vหรือเว็บเซิร์ฟเวอร์ที่ถูกผูกไว้อย่างใดอย่างหนึ่งphpinfo();)


5

ไม่คาดหวัง T_LNUMBER

โทเค็นT_LNUMBERหมายถึงหมายเลข "ยาว"

  1. ชื่อตัวแปรไม่ถูกต้อง

    ใน PHP และภาษาการเขียนโปรแกรมส่วนใหญ่ตัวแปรไม่สามารถขึ้นต้นด้วยตัวเลขได้ อักขระตัวแรกต้องเป็นตัวอักษรหรือขีดล่าง

    $1   // Bad
    $_1  // Good

    * * * *

    • บ่อยครั้งที่เกิดขึ้นสำหรับการใช้preg_replace-placeholder "$1"ในบริบท PHP:

      #                         ↓            ⇓  ↓
      preg_replace("/#(\w+)/e",  strtopupper($1) )

      ตำแหน่งที่ควรจะได้รับการติดต่อกลับ (ตอนนี้/eค่าสถานะ regex เลิกใช้แล้ว แต่บางครั้งก็ยังใช้งานผิดในpreg_replace_callbackฟังก์ชั่น)

    • ข้อ จำกัด ของตัวระบุเดียวกันนี้ใช้กับคุณสมบัติของวัตถุคือ btw

             
      $json->0->value
    • ในขณะที่ tokenizer / parser ไม่อนุญาตให้มีตัวอักษร$1เป็นชื่อตัวแปรหนึ่งที่สามารถใช้หรือ${1} ${"1"}ซึ่งเป็นวิธีแก้ปัญหาสำหรับตัวระบุที่ไม่ได้มาตรฐาน (เป็นการดีที่สุดที่จะคิดว่ามันเป็นการค้นหาขอบเขตในเครื่อง แต่โดยทั่วไป: ชอบอาร์เรย์ธรรมดาสำหรับกรณีดังกล่าว!)

    • แต่ไม่แนะนำอย่างมากตัวแยกวิเคราะห์ PHPs อนุญาต Unicode-identifiers; เช่นนั้น$➊จะถูกต้อง (ไม่เหมือนตัวอักษร1)

  2. รายการอาร์เรย์ที่ผิดพลาด

    ความยาวที่ไม่คาดคิดสามารถเกิดขึ้นได้สำหรับการประกาศอาร์เรย์ - เมื่อไม่มี,เครื่องหมายจุลภาค:

    #            ↓ ↓
    $xy = array(1 2 3);

    หรือเรียกใช้ฟังก์ชันและการประกาศและโครงสร้างอื่น ๆ เช่นเดียวกัน:

    • func(1, 2 3);
    • function xy($z 2);
    • for ($i=2 3<$z)

    ดังนั้นมักจะมีหนึ่งใน;หรือ,หายไปสำหรับการแยกรายการหรือการแสดงออก

  3. HTML ที่ผิดพลาด

    และอีกครั้งสตริงผิดพลาดเป็นแหล่งที่มาของตัวเลขหลงทางบ่อย:

    #                 ↓ ↓          
    echo "<td colspan="3">something bad</td>";

    กรณีดังกล่าวควรได้รับการปฏิบัติมากกว่าหรือน้อยกว่าเช่นข้อผิดพลาดT_STRING ที่ไม่คาดคิด

  4. ตัวระบุอื่น ๆ

    ฟังก์ชันคลาสหรือเนมสเปซไม่สามารถตั้งชื่อเริ่มต้นด้วยตัวเลขได้

             
    function 123shop() {

    ค่อนข้างเหมือนกันกับชื่อตัวแปร


2

ไม่คาดหวัง '='

ซึ่งอาจเกิดจากการมีอักขระที่ไม่ถูกต้องในชื่อตัวแปร ชื่อตัวแปรจะต้องเป็นไปตามกฎเหล่านี้:

ชื่อตัวแปรปฏิบัติตามกฎเช่นเดียวกับป้ายกำกับอื่น ๆ ใน PHP ชื่อตัวแปรที่ถูกต้องเริ่มต้นด้วยตัวอักษรหรือขีดล่างตามด้วยจำนวนตัวอักษรตัวเลขหรือขีดล่างใด ๆ ตามปกติแล้วนิพจน์จะแสดงดังนี้: '[a-zA-Z_ \ x7f- \ xff] [a-zA-Z0-9_ \ x7f- \ xff] *'


นอกจากนี้ดีจอห์น
Funk Forty Niner

1

ไม่คาดหวัง 'ดำเนินการต่อ' (T_CONTINUE)

continueเป็นคำสั่ง (เช่นสำหรับหรือถ้า) และจะต้องปรากฏแบบสแตนด์อโลน มันไม่สามารถใช้เป็นส่วนหนึ่งของการแสดงออก ส่วนหนึ่งเป็นเพราะการดำเนินการต่อไม่ส่งคืนค่า แต่ในนิพจน์ทุกนิพจน์ย่อยต้องส่งผลให้เกิดค่าบางค่าดังนั้นนิพจน์โดยรวมจะส่งผลให้มีค่า นั่นคือความแตกต่างระหว่างคำสั่งและการแสดงออก

หมายความว่าcontinueไม่สามารถใช้ในคำสั่งที่สามหรือคำสั่งใด ๆ ที่ต้องการค่าส่งคืน

'หยุด' ไม่คาดหวัง (T_BREAK)

กันไปbreak;แน่นอน นอกจากนี้ยังไม่สามารถใช้งานได้ในบริบทของนิพจน์ แต่เป็นคำสั่งที่เข้มงวด (ในระดับเดียวกับforeachหรือifบล็อก)

ไม่คาดหวัง 'คืน' (T_RETURN)

ตอนนี้อาจจะเป็นที่น่าแปลกใจมากขึ้นสำหรับการreturnแต่ที่ยังเป็นเพียงแค่ระดับบล็อกคำสั่ง มันจะส่งกลับค่า (หรือ NULL) เพื่อขอบเขต / ฟังก์ชั่นที่สูงขึ้น แต่มันไม่ได้ประเมินว่าการแสดงออกของตัวเอง →นั่นคือ: ไม่มีประเด็นในการทำreturn(return(false);;


1

ไม่คาดหวัง '.'

สิ่งนี้สามารถเกิดขึ้นได้หากคุณพยายามใช้ตัวดำเนินการ splat ( ...)ใน PHP รุ่นที่ไม่รองรับ

... เริ่มใช้งานได้ใน PHP 5.6 เพื่อจับจำนวนตัวแปรที่ขัดแย้งกับฟังก์ชัน:

function concatenate($transform, ...$strings) {
    $string = '';
    foreach($strings as $piece) {
        $string .= $piece;
    }
    return($transform($string));
}

echo concatenate("strtoupper", "I'd ", "like ", 4 + 2, " apples");
// This would print:
// I'D LIKE 6 APPLES

ใน PHP 7.4 คุณสามารถใช้กับนิพจน์ Arrayได้

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

0

ไม่คาดหวัง 'ปลาย' (T_ENDWHILE)

ไวยากรณ์ใช้โคลอน - หากไม่มีโคลอนจะเกิดข้อผิดพลาดด้านบน

<?php while($query->fetch()): ?>
 ....
<?php endwhile; ?>

ทางเลือกอื่นของไวยากรณ์นี้คือการใช้วงเล็บปีกกา:

<?php while($query->fetch()) { ?>
  ....
<?php } ?>

http://php.net/manual/en/control-structures.while.php


0

ข้อผิดพลาดที่เริ่มต้นParse error: syntax error, unexpected ':'อาจเกิดจากความผิดพลาดในการเขียนการอ้างอิงระดับคงที่เป็นClass::$VariableClass:$Variable

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.