PHP คาดว่า T_PAAMAYIM_NEKUDOTAYIM


542

ไม่มีใครมีT_PAAMAYIM_NEKUDOTAYIM?


22
บางครั้งนี่เป็นวิธีการของ PHP ที่จะบอกคุณว่าคุณขาดเครื่องหมาย $ ... ตัวอย่างเช่นถ้าคุณเขียน _SESSION ["foo"] แทน $ _SESSION ["foo"]
Gonzo

131
ฮิบรูสำหรับลำไส้ใหญ่สองครั้ง แต่ ... ดูbugs.php.net/bug.php?id=14492 : "BTW มีการสะกดผิดในข้อผิดพลาดในการแยกวิเคราะห์ควรเป็น T_PAAMAYIM_NEKUDATAYIM (ในภาษาฮิบรู 'คู่' แบบฟอร์มเป็นเพียงคำนามดั้งเดิม + คำต่อท้าย 'ayim' และ 'nekuda' เป็นรูปแบบเดียว ['nekudot' คือรูปแบบพหูพจน์]) "
Wolfgang Fahl

66
@ WolfgangFahl ฉันรู้อะไรบางอย่างเกี่ยวกับข้อผิดพลาดที่ดูเหมือนผิดพลาด
Peter Turner

14
@WolfgangFahl uสะกดผิดเป็นเพียงหนึ่งที่หายไป T_PAAMAYIM_NEKUDOTAYIMมันควรจะเป็น ( PAAMAYIM= "สองครั้ง", NEKUDOTAYIM= := "נקודותיים")
ทอม

15
เมื่อฉันเห็นข้อผิดพลาดนี้ฉันจ้องที่หน้าจอ dumbstruck ประมาณ 30 วินาทีจากนั้นก็หัวเราะออกมาและไปสูบบุหรี่ ciggarette: F 1+
n00b

คำตอบ:


342

เป็นตัวดำเนินการโคลอนคู่::(ดูรายการ parser โทเค็น )


11
ไม่ได้จริงๆ ทดสอบสิ่งนี้var_dump(empty(TRUE))
machineaddict

1
@machineaddict คำถาม / คำตอบผิด
Gumbo

2
ไม่ฉันเพิ่งเพิ่มการประเมินผลที่ส่งกลับ T_PAAMAYIM_NEKUDOTAYIM เดียวกัน ฉันพบมันโดยไม่ได้ตั้งใจ
machineaddict

6
@Web_Developer เหตุผลที่เกิดขึ้นเป็นเพราะถ้าคุณมีforeach($cats as catตัวละครที่ได้รับการยอมรับเฉพาะหลังจากที่catเป็นคำสั่งที่ถูกต้องไวยากรณ์คือมันจะช่วยให้คุณสามารถระบุสถานที่ให้บริการแบบคงที่ของการเรียนบางคนเรียก:: catเช่นถ้าcatคลาสมีสมาชิกแบบสแตติกสาธารณะที่เรียกว่า$mouseแล้วforeach($cats as cat::$mouse)จะถูกต้องสมบูรณ์phpแต่คำสั่งที่มีสิ่งอื่นนอกเหนือจาก::หลังจากนั้นcatจะเป็นข้อผิดพลาดทางไวยากรณ์ หาก$mouseไม่ใช่คุณสมบัติที่ประกาศของcatคุณจะได้รับข้อผิดพลาดร้ายแรง แต่ก็ยังไม่ใช่ข้อผิดพลาดทางไวยากรณ์
chiliNUT

2
var_dump (ว่าง (TRUE)) เพียงแค่ส่งคืนบูล (เท็จ) ใน PHP 7.2
โปรแกรมเมอร์ Dancuk

110

Google ทำงานได้อย่างมหัศจรรย์

มันเป็นภาษาฮีบรูสำหรับ "โคลอนคู่"


3
@MattiVirkkunen เกี่ยวกับภาษาใหม่ที่ยอมรับข้อผิดพลาดคอมมิชชันไวยากรณ์ในภาษาใด ๆ :) เราทำได้.
Hector

2
Google พาฉันมาที่นี่
สุมิตร

2
israelis เขียน php :)
sd1sd1

@ sd1sd1 ใช่มันอาจจะเป็น Zeev ที่เขียนนั่น
peterchaula

53

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


1
ฟังก์ชั่นเป็นภาษาอังกฤษ แต่ข้อผิดพลาดนั้นเป็นภาษาฮีบรู ฉันไม่แน่ใจว่ามีข้อผิดพลาดอื่น ๆ ในภาษาฮิบรูหรือไม่
alex

19
สตริงไฮไลต์คือלהדגישמחרוזת จากนี้ไปฉันจะใช้ฟังก์ชัน array_push ที่กำหนดเองของฉันเท่านั้นלדחוף_מערךเป็นตัวอักษรภาษาฮิบรูแน่นอน ฉันแน่ใจว่าเพื่อนร่วมงานที่ไม่ได้พูดภาษาฮีบรูทั้งหมดจะรักมัน ทีมนักพัฒนาของเราพูดภาษาอย่างน้อยหนึ่งภาษาที่เขียนด้วยอักขระที่ไม่ใช่ละติน ควรจะสนุก :)
ไอแซก

3
สาเหตุที่เป็นภาษาฮีบรูนั้นเป็นเพราะอิสราเอลเขียนรหัสขึ้นมา ฉันไม่คิดว่าพวกเขาพลาดข้อผิดพลาดพวกเขาปล่อยให้มันมีการแปลที่ไม่ได้เตือน
Raul

5
@Raul ตกลงดังนั้นในโครงการต่อไปของฉันฉันจะเขียนรหัสข้อผิดพลาดเป็นภาษาอิตาลีฉันเป็นคนอิตาลี! คุณคาดหวังอะไรอังกฤษทุกที่? :-)
Gianluca Ghettini

@Ilya Birman มันไม่ได้แปลว่า "ลำไส้ใหญ่สอง" อย่างแท้จริง มันหมายถึงแท้จริง "สองครั้งจุดสองจุด"
Sapphire_Brick

47

จากWikipedia :

ใน PHP ตัวดำเนินการแก้ปัญหาขอบเขตเรียกอีกอย่างว่า Paamayim Nekudotayim (อิสราเอล: פעמייםנקודתיים) ซึ่งแปลว่า "ทวิภาคคู่" ในภาษาฮิบรู

ชื่อ "Paamayim Nekudotayim" ถูกนำมาใช้ใน Zend Engine 0.5 ที่พัฒนาโดยอิสราเอลใน PHP 3 แม้ว่ามันจะสร้างความสับสนให้กับนักพัฒนาหลายคนที่ไม่พูดภาษาฮิบรู แต่มันก็ยังถูกใช้ใน PHP 5 เช่นเดียวกับในข้อความแสดงข้อผิดพลาดตัวอย่างนี้ :

$ php -r :: ข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาดทางไวยากรณ์ T_PAAMAYIM_NEKUDOTAYIM ที่ไม่คาดคิด

ในฐานะของ PHP 5.4 ข้อความแสดงข้อผิดพลาดเกี่ยวกับตัวดำเนินการแก้ไขขอบเขตยังคงมีชื่อนี้อยู่ แต่ได้ชี้แจงความหมายของมันค่อนข้าง:

$ php -r :: ข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาดทางไวยากรณ์, '::' (T_PAAMAYIM_NEKUDOTAYIM ที่ไม่คาดคิด)

จากเอกสาร PHP อย่างเป็นทางการ :

ตัวดำเนินการแก้ปัญหาขอบเขต (หรือเรียกอีกอย่างว่า Paamayim Nekudotayim) หรือในแง่ที่ง่ายกว่าคือโคลอนคู่เป็นโทเค็นที่อนุญาตให้เข้าถึงคุณสมบัติหรือเมธอดแบบคงที่ค่าคงที่และแทนที่ของคลาส

เมื่ออ้างอิงรายการเหล่านี้จากภายนอกคำจำกัดความของคลาสให้ใช้ชื่อของคลาส

ตั้งแต่ PHP 5.3.0 เป็นไปได้ที่จะอ้างอิงคลาสโดยใช้ตัวแปร ค่าของตัวแปรไม่สามารถเป็นคำหลัก (เช่นตนเองผู้ปกครองและคงที่)

Paamayim Nekudotayim ในตอนแรกดูเหมือนจะเป็นทางเลือกที่แปลกสำหรับการตั้งชื่อลำไส้ใหญ่สองครั้ง อย่างไรก็ตามในขณะที่เขียน Zend Engine 0.5 (ซึ่งใช้งาน PHP 3) นั่นคือสิ่งที่ทีม Zend ตัดสินใจเรียกใช้ จริง ๆ แล้วมันหมายถึงสองลำไส้ใหญ่ - ในภาษาฮิบรู


1
ภาษาฮิบรูเป็นภาษาพูดจริง Wikipedia ตอนนี้พูดว่า: "ใน PHP ตัวดำเนินการแก้ปัญหาขอบเขตเรียกอีกอย่างว่า Paamayim Nekudotayim (ฮีบรู: פעמיים, נקודותיים, ออกเสียง [paʔaˈmajim] ” ในภาษาฮิบรู "
ไมค์

11

สิ่งนี้จะเกิดขึ้นเมื่อคุณใช้ค่าคงที่ใน PHP กับฟังก์ชั่น empty ():

if (!empty(SOME_CONSTANT)) {

}

นั่นคือกรณีของฉัน ฉันแก้ไขมันโดยใช้สิ่งนี้:

$string = SOME_CONSTANT;
if (!empty($string)) {

}

2
ทำไมค่าคงที่จะว่างเปล่า?
อย่าตื่นตระหนก

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

6
@ อย่าตกใจ: ทำไมล่ะ empty () ไม่เพียง แต่ทดสอบว่ามีตัวแปรอยู่หรือไม่และหากค่าของมันคือ "empty" (ในกรณีที่ PHP มีค่าศูนย์ (0) ก็จะว่างเปล่า) ค่าคงที่ดังกล่าวอาจแสดงถึงค่าที่ผู้ใช้ต้องการเปลี่ยนแปลงเช่นการตั้งค่าฐานข้อมูลหรือค่าจริง / เท็จและประเภทค่าอื่น ๆ ซึ่งผู้พัฒนาโค้ดไม่ทราบในขณะออกแบบ นี่เป็นเรื่องปกติสำหรับ API หรือกรอบรหัส ฉันแค่ไม่เข้าใจว่าทำไมนักพัฒนาโปรแกรมแยกวิเคราะห์ Zend ไม่ได้ใช้คำทั่วไปที่ทุกคนรู้และเข้าใจ แต่ใช้ภาษาฮิบรูแทน ฉันหมายความว่ามันไม่ตลกจริงๆเลย
StanE

ฉันใช้ค่าคงที่ในไฟล์กำหนดค่าและฉันต้องการทราบในรหัสหากค่าคงที่เฉพาะเจาะจงว่างเปล่า (null, เท็จ, 0, สตริงว่าง, อาร์เรย์ emty .... ) ฉันควรทดสอบกับทั้งหมดด้วยตนเองหรือไม่ WTF
qdev

5

ฉันรู้ว่าชาวฮีบรูค่อนข้างดีดังนั้นเพื่ออธิบายชื่อ "Paamayim Nekudotayim" ให้คุณฟังความหมายที่ถูกถอดความคือ "ทวิภาคคู่" แต่แปลตามตัวอักษร:

  • "Paamayim" หมายถึง "สอง" หรือ "สองครั้ง"
  • "Nekudotayim" หมายถึง "จุด" (สว่างแล้ว "รู")
    • ในภาษาฮิบรูnekudaหมายถึงจุด
    • พหูพจน์คือnekudotคือจุดที่ทำหน้าที่เหมือนเสียงสระในภาษาอังกฤษ
    • เหตุผลว่าทำไมมันถูกเรียกว่า Nekudo - tayimนั้นเป็นเพราะคำต่อท้าย "-ayim" ยังหมายถึง "สอง" หรือ "สองครั้ง" แต่โดยปกติจะหมายถึงวัตถุสองชิ้นมากกว่าสองการกระทำดังนั้นจะ::ระบุ "สองครั้งสองจุด" หรือมากกว่า เป็นที่รู้จักกันทั่วไปว่าเป็นขอบเขตความละเอียดประกอบการ

2

สิ่งนี้สามารถเกิดขึ้นได้ใน foreachs เมื่อใช้:

foreach( $array as $key = $value )

แทน

foreach( $array as $key => $value )

1

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

ใน PHP 5.3 ขึ้นไป $this::$defaultsทำงานได้ดี; เมื่อฉันเปลี่ยนรหัสเป็นเซิร์ฟเวอร์ที่ด้วยเหตุผลใดก็ตามที่มีหมายเลขรุ่นต่ำกว่ามันก็โยนข้อผิดพลาดนี้

ในกรณีของฉันการแก้ปัญหาคือการใช้คำหลักselfแทน$this:

self::$defaults ทำงานได้ดี


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