“ do something OR DIE ()” ทำงานอย่างไรใน PHP?


99

ฉันกำลังเขียนแอพ php เพื่อเข้าถึงฐานข้อมูล MySQL และในบทช่วยสอนมันบอกบางอย่างในแบบฟอร์ม

mysql_connect($host, $user, $pass) or die("could not connect");

PHP รู้ได้อย่างไรว่าฟังก์ชั่นล้มเหลวเพื่อให้เรียกใช้ส่วนแม่พิมพ์ ฉันเดาว่าฉันกำลังถามว่าส่วน "หรือ" ทำงานอย่างไร ไม่คิดว่าจะเคยเห็นมาก่อน


3
นอกจากนี้อย่าใช้ตรรกะแบบนี้ในแอปพลิเคชันจริง ยังคงทำให้ฉันประหลาดใจที่มีบทเรียนมากมายที่ทำเช่นนั้น
Eran Galperin

2
ทำไมไม่ใช้ล่ะ? เป็นเรื่องที่ดีและน่าอ่านจริงๆ ...
rkj

11
อาจเป็นเรื่องง่ายและเหมาะสมสำหรับบทช่วยสอน แต่คุณไม่ต้องการให้สคริปต์ของคุณตายอย่างไม่น่าให้อภัยด้วยข้อความแสดงข้อผิดพลาดเช่นนั้นต่อหน้าผู้ใช้จริง การแสดงหน้าข้อผิดพลาดที่กำหนดเอง (โดยไม่ระบุข้อผิดพลาดจริง!) + การบันทึกข้อผิดพลาดเป็นสิ่งที่จำเป็น
Eran Galperin

4
ฉันกำลังพูดถึง "หรือ" ไม่ใช่ "ตาย"
Artelius

21
mysql_connect ($ host, $ user, $ pass) หรือ PrintNiceError ('DatabsaeConnectionError');
matpie

คำตอบ:


134

หากคำสั่งแรกส่งคืนtrueดังนั้นคำสั่งทั้งหมดจะต้องเป็นtrueส่วนที่สองจะไม่ถูกเรียกใช้

ตัวอย่างเช่น:

$x = 5;
true or $x++;
echo $x;  // 5

false or $x++;
echo $x; // 6

ดังนั้นหากการสืบค้นของคุณไม่สำเร็จระบบจะประเมินdie()คำสั่งและสิ้นสุดสคริปต์


1
คำอธิบายที่ดี โครงสร้างภาษา "โดยนัยถ้า" ของ PHP นี้เป็นอันตรายเล็กน้อยเนื่องจากคุณสามารถมีข้อความที่คุณคิดว่าถูกเรียกใช้งาน แต่ทำไม่ได้จริง ๆ และไม่ชัดเจนเท่ากับว่าคุณมีบล็อก if
Petruza

6
สิ่งนี้เรียกว่าการประเมินการลัดวงจรและมีประโยชน์ในภาษาอื่นที่ไม่ใช่ PHP เช่นกัน
Mr Griever

1
อย่างไรก็ตามคุณสามารถใช้คำสั่งเดียวหลัง OR คำสั่งบล็อกจะล้มเหลวในการตรวจสอบไวยากรณ์ (เช่นข้อความแสดงข้อผิดพลาดที่เกิดขึ้นจริงอาจเป็นข้อผิดพลาดในการแยกวิเคราะห์: ข้อผิดพลาดทางไวยากรณ์ไม่คาดคิด '{' ใน ... )
Scott Chu

และที่นี่ฉันคิดว่านี่เป็นคุณสมบัติขั้นสูงบางอย่างเช่นwithคำสั่งของ python เมื่อเป็นเพียงนิพจน์บูลีน ... ฉันคิดว่าควรระมัดระวังเป็นพิเศษเมื่อใช้นิพจน์นี้หากคุณคาดว่าจะทำการล้างข้อมูลในกรณีของ ข้อผิดพลาด โปรดแก้ไขฉันหากฉันผิด แต่ถ้าคุณทำfunc_call($file) or die();และฟังก์ชั่นล้มเหลวไฟล์จะเปิดทิ้งไว้เมื่อสคริปต์ตาย
pedromanoel

@Petruza เป็นแนวทางปฏิบัติที่ดีในการใช้orในสถานการณ์ที่ifสามารถใช้งานได้หรือไม่?
limeandcoconut

32

PHP orทำงานเหมือน C ||(ซึ่งโดยบังเอิญได้รับการสนับสนุนโดย PHP - orดูดีกว่าและมีลำดับความสำคัญของตัวดำเนินการที่แตกต่างกัน - ดูหน้านี้ )

เป็นที่รู้จักกันในชื่อตัวดำเนินการลัดวงจรเนื่องจากจะข้ามการประเมินใด ๆ เมื่อมีข้อมูลเพียงพอที่จะตัดสินค่าสุดท้าย

ในตัวอย่างของคุณถ้าmysql_connect()ส่งกลับค่า TRUE PHP ก็รู้แล้วว่าคำสั่งทั้งหมดจะประเมินเป็น TRUE ไม่ว่าจะประเมินเป็นdie()อย่างไรและด้วยเหตุนี้จึงdie()ไม่ได้รับการประเมิน

หากmysql_connect()ส่งกลับค่า FALSE PHP จะไม่รู้ว่าคำสั่งทั้งหมดจะประเมินเป็น TRUE หรือ FALSE ดังนั้นจึงดำเนินต่อไปและพยายามประเมินdie()- สิ้นสุดสคริปต์ในกระบวนการ

เป็นเพียงเคล็ดลับดีๆที่ใช้ประโยชน์จากวิธีการorทำงาน


+1 สำหรับการตั้งชื่อการลัดวงจร อาจมีชื่อว่า "side effect" ด้วย เราไม่สนใจเลยในโค้ดส่งคืน die () เราแค่ต้องการผลของการดำเนินการ (ไม่ใช่ว่าจะตายเสมอไป ()) สิ่งนี้ไม่ได้รับความนิยมในหมู่คนเจ้าระเบียบเสมอไปเนื่องจากเอฟเฟกต์บางอย่างอาจไม่ชัดเจน
mckenzm

และนี่ไม่ใช่ทั้งหมด คุณยังสามารถใช้และรวมสิ่งต่างๆได้โดยที่คุณต้องการให้สิ่งนั้นได้ผลก่อนที่จะทำสิ่งที่สอง
My1

11

มันทำงานตามที่คนอื่นอธิบายไว้

ใน PHP ห้ามใช้ "die" เนื่องจากจะไม่เพิ่มข้อยกเว้น (เช่นเดียวกับใน Perl) แทนที่จะโยนข้อยกเว้นอย่างถูกต้องด้วยวิธีปกติ

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


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