การใช้โอเปอร์เรเตอร์ของ PHP ด้วยอาร์กิวเมนต์เพียงสองตัว


9

ฉันเพิ่งตรวจสอบบางส่วนของรหัสของฉันและสังเกตเห็นว่าในแบบที่ขาดสติฉันจะออกจากโครงสร้างดังต่อไปนี้:

$guid = empty($subscription->guid) ?  : $subscription->guid;

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

ตั้งแต่ PHP 5.3 เป็นไปได้ที่จะปล่อยให้ผู้ให้บริการรายกลางอยู่ Expression expr1?: expr3 ส่งคืน expr1 ถ้า expr1 หาค่าเป็น TRUE และ expr3 เป็นอย่างอื่น

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


คุณควรใช้ตัวดำเนินการรวมศูนย์ว่างสำหรับ Varsolp techflirt.com/null-coalescing-operator-php
Ankur Kumar Singh

คำตอบ:


7

ผู้ประกอบการที่มีเงื่อนไขประกอบไปด้วยโดยไม่ต้องอาร์กิวเมนต์ที่สองเป็นนวนิยายเรื่องเล็กน้อย แต่ก็เป็นที่คล้ายกัน1ไปด้วย null หลอมรวมผู้ประกอบการพบว่าในภาษา Algol ตราสารอนุพันธุ์อื่น ๆ เช่นC #และ Perl และที่คุณพูดถึง||ผู้ประกอบการในทับทิม (และจาวาสคริปต์)

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

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

ถ้านั่นไม่ใช่สิ่งที่คุณกังวลและทีมของคุณเห็นด้วยกับการใช้งาน (หรือถ้าคุณเป็นนักพัฒนาเดี่ยวถ้าคุณพอใจกับมัน) โดยทุกอย่างไปได้เลย เช่นตัวคั่นเนมสเปซฉันคิดว่ามันจะต้องเป็นเรื่องจริงเมื่อไหร่ไม่ใช่ว่าจะเป็นที่ยอมรับในโครงการ PHP ในอนาคตทั้งหมด


หมายเหตุ 1 : แต่ไม่เหมือนกันให้ผู้ประกอบการด้วย null หลอมรวมการทดสอบเฉพาะใน null ไม่ใช่ค่า (และไม่ได้ค่า truthy เช่น PHP) และ?:ไวยากรณ์ไม่ประกาศไม่ได้กำหนดปราบเป็นคุณกล่าวถึงในการแสดงความคิดเห็น


ในขณะนี้ 'ทีม' ของฉันประกอบด้วยฉันอย่างหมดจด การโฮสต์ไม่ใช่ปัญหาเนื่องจากเราโฮสต์ 98% ของเว็บไซต์ที่เราสร้างขึ้นและเราโฮสต์ที่ด้านบนของ 5.3.6 ฉันรู้ว่าฟังก์ชั่นนั้นไม่ได้ผิดปกติเพียงแค่ไวยากรณ์ของมันซึ่งเป็นสาเหตุของคำถาม นอกจากนี้ยังมีปัญหาที่ไม่เหมือนตัวดำเนินการรวมศูนย์ที่ไม่มีไวยากรณ์อีกด้วย ( @เพื่อซ่อนประกาศเกี่ยวกับสิ่งที่ไม่ได้กำหนด)
Matthew Scharley

3
@ MatthewScharley หากการกำหนดตัวคั่นเนมสเปซ (\) เป็นสิ่งบ่งชี้ใด ๆ ไวยากรณ์แปลก ๆ ไม่ใช่อุปสรรคต่อการนำไปใช้อย่างกว้างขวางใน PHP มันลงมาจริง ๆ เมื่อไม่คุณควรเริ่มใช้มัน

3

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


ตัวอย่างที่ได้รับเป็นสิ่งที่ผิด การใช้ภาษาที่ถูกต้องของการทำงานตามที่ตั้งใจจะเป็นซึ่งเทียบเท่ากับ$foo = @$bar ?: 'baz' $foo = (@$bar ? $bar : 'baz')ฉันเห็นด้วยกับความคิดเห็นของคุณแม้ว่า
Matthew Scharley

1

ดี, PHP มีชนิดบูลีนและ||ผู้ประกอบการส่งกลับ boolen ดังนั้นใน PHP ผลมาจากการ$a || $bเป็นบูลนี้มีความสอดคล้องกับ&&เช่นเดียวกับ&&มันทำให้รู้สึกเล็ก ๆ น้อย ๆ ที่จะกลับมาหนึ่งหรืออื่น ๆ แต่ทำให้รู้สึกถึงผลตอบแทน/true falseการมีตัวดำเนินการบูลีนทั้งหมดคืนค่าบูลฟังดูค่อนข้างสมเหตุสมผลเช่นกัน

นอกจากนี้ยังไม่มีการประดิษฐ์จาก PHP แต่ทำตาม C ซึ่งองค์ประกอบการออกแบบมากมายของ "classic" PHP มาจาก การอ้างอิงจาก§6.5.14ของมาตรฐาน C99:

| | | โอเปอเรเตอร์จะให้ผลลัพธ์ 1 ถ้าตัวถูกดำเนินการตัวใดตัวหนึ่งเปรียบเทียบตัวไม่เท่ากันกับ 0 มิฉะนั้นจะให้ผลลัพธ์ 0 ผลลัพธ์มีประเภท int

และสิ่งที่คุณควรใช้?: หรือไม่สามารถตอบได้ในรูปแบบทั่วไป แต่ความคิด: วิธีที่ดีที่สุดในการใช้ภาษาคือการใช้โครงสร้างที่ให้และใช้กระบวนทัศน์ที่แนะนำ มีความรู้สึกเล็กน้อยในการเขียนโค้ด Java เช่นรหัส C หรือวิธีอื่น ๆ รอบ ;-)


0

ฉันคิดว่ามันเป็นโอเปอเรเตอร์ที่มีประโยชน์มากและควรใช้อย่างแน่นอนเนื่องจากมาตรฐานภาษากำหนดไว้อย่างชัดเจน

โปรดทราบว่ามันถูกเรียกอย่างเป็นทางการว่าElvis Operatorใน Grooy (เพราะเหตุใดเพียงแค่มองมันอย่างใกล้ชิด!) และได้รับการเสนอให้เปิดตัวใน Java 7

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