ตัวดำเนินการไม่สองเท่า (!!) ใน PHP


188

ตัวดำเนินการ double ที่ไม่ทำใน PHP คืออะไร

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

return !! $row;

รหัสด้านบนจะทำอะไร?


32
นี่เป็นสิ่งสำคัญเช่นเดียวกับการทำreturn (bool) $row;
WildlyInaccurate

5
ฉันสงสัยว่าอันไหนของพวกเขาเร็วกว่านี้และเรามี (บูล) เป็นผู้ชนะ i.stack.imgur.com/dcnsM.png
Binod Kalathil

1
@Binod นั่นเป็นข้อมูลที่ดีที่ต้องขอบคุณสำหรับสิ่งนั้น!
Robin K

คำตอบ:


291

ไม่ใช่ "ตัวดำเนินการที่ไม่เป็นสองเท่า" ไม่ใช่ตัวดำเนินการที่ใช้สองครั้ง สิทธิที่!จะมีผลในแบบบูล, โดยไม่คำนึงถึงตัวถูกดำเนินการ จากนั้นทางซ้าย!จะลบล้างบูลีนนั้น

ซึ่งหมายความว่าสำหรับค่าจริงใด ๆ (ตัวเลขอื่นนอกเหนือจากศูนย์สตริงและอาร์เรย์ที่ไม่ว่าง ฯลฯ ) คุณจะได้รับค่าบูลีนTRUEและสำหรับค่าเท็จใด ๆ (0, 0.0, NULLสตริงว่างหรืออาร์เรย์ว่าง) คุณจะได้รับ FALSEค่าบูลีน

มันเทียบเท่ากับการใช้งานกับนักแสดงboolean:

return (bool)$row;

22
"double-not-operator" หรือ "double not-operator" .. ขึ้นอยู่กับวิธีที่คุณอ่าน
nickf

9
@nickf ไม่จริงๆ "double not operator" หมายถึงหนึ่ง operator ไม่ใช่การใช้ not operator สองครั้ง
Theo

3
@Theo มันเป็นหนึ่งในผู้ประกอบการจริง ๆ ? ล่ามพิจารณาว่า!!เท่ากับ(bool)ในกรณีนี้หรือไม่? หรือจะเรียกใช้รหัสเครื่องที่แตกต่างกันขึ้นอยู่กับว่าจะใช้รหัสใด
Pacerier

ใช้งานได้กับ JavaScript เช่นกันนี่คือรายการค่า Falsy สำหรับ Javascriptและนี่คือรายการค่า Falsy สำหรับ PHP
Jomar Sevillejo

1
คุณสามารถใช้มากเท่าที่คุณต้องการ หากมีเลขคี่ของ 'เรียบ' (เครื่องหมายอัศเจรีย์) มันจะเป็นการดำเนินงานไม่ได้เช่นเดียวกับและถ้ามีจำนวนแม้แต่เรียบมันจะเป็นเช่นเดียวกับ!value (bool) value
diamondsea

51

มันเหมือนกัน (หรือเกือบเหมือนกัน - อาจจะมีบางกรณีที่มุม) เป็นชี้ขาดให้บูล หาก$rowจะทำให้เป็นจริงก็!! $rowเป็นจริงเช่นกัน

แต่ถ้าคุณต้องการที่จะประสบความสำเร็จ(bool) $rowคุณควรใช้คำนั้น - ไม่ใช่คำที่ "น่าสนใจ")


2
ขอบคุณจริงที่ทำให้รู้สึกฉัน nevers เห็นอะไรเช่นนี้ในภาษาโปรแกรมอื่น ๆ
Andrei

16
การใช้!!เป็นนิสัยที่เหลือจากการเขียนโปรแกรมใน C (++) ใน C ทำหล่อไม่ได้เป็นเรื่องง่ายเหมือนใน PHP, คุณจะได้รับปัญหาที่แตกต่างกันหลายคำเตือนรวบรวม Aso ดังนั้นคนที่โยนไป Boll !!โดยใช้
NikiC

1
@nikic - ฟังดูแปลก IMO ... เนื่องจากoperator!ใช้งานมากเกินไปการใช้งานในC++นั้นอาจเป็นอันตรายได้ นอกจากนี้คุณไม่สามารถร่าย structs ใน C หรือใช้!กับพวกมันได้ นอกจากนี้หากบางสิ่งสามารถถูกทำให้ยุ่งเหยิงได้คุณมีโอกาสมากที่สุดที่จะคืนค่ามันจากฟังก์ชันที่ส่งคืนค่า int ซึ่งค่อนข้างทำให้บูลีน คุณแน่ใจหรือว่าคุณกำลังพูดถึง C
viraptor

2
ฉันเคยเห็น !! ในโปรแกรม C หลาย ๆ โปรแกรมว่าเป็นการแปลงที่ปลอดภัยเป็น 1/0 (ในฐานะที่เป็นบูลีนจริงๆไม่มีอะไรนอกจาก 0 / "ไม่ใช่ศูนย์" ใน C. )
ศ. Falken

1
@viraptor !!ไม่มีอะไร "น่าสนใจ" ตามที่คุณอ้างสิทธิ์ มันอยู่ทั่วทุกที่ตั้งแต่ C ถึง JavaScript
Pacerier

18

มันหมายความว่าถ้า$rowมีtruthyคุ้มค่าก็จะกลับtrueมิฉะนั้นfalseแปลงเป็นค่าบูลีน

นี่คือตัวอย่างนิพจน์การแปลงบูลีนจาก php docs

Expression             Boolean
$x = "";               FALSE
$x = null;             FALSE
var $x;                FALSE
$x is undefined        FALSE
$x = array();          FALSE
$x = array('a', 'b');  TRUE
$x = false;            FALSE
$x = true;             TRUE
$x = 1;                TRUE
$x = 42;               TRUE
$x = 0;                FALSE
$x = -1;               TRUE
$x = "1";              TRUE
$x = "0";              FALSE
$x = "-1";             TRUE
$x = "php";            TRUE
$x = "true";           TRUE
$x = "false";          TRUE

7

"ไม่ใช่ไม่" เป็นวิธีที่สะดวกในหลายภาษาสำหรับการทำความเข้าใจความจริงค่าภาษาที่กำหนดให้กับผลของการแสดงออกใด ๆ ตัวอย่างเช่นในPython :

>>> not not []
False
>>> not not [False]
True

สามารถสะดวกในสถานที่ที่คุณต้องการลดค่าที่ซับซ้อนลงไปเป็นอย่างเช่น "มีค่าหรือไม่?"


1

อีกคนมากขึ้นอาจจะง่ายกว่าวิธีการ 'อ่าน' ไม่ใช่:

  • ครั้งแรก '!' ทำ 2 สิ่ง: 'แปลง' ค่าเป็นบูลีนแล้วเอาท์พุทตรงกันข้าม ดังนั้นมันจะเป็นจริงถ้าค่านั้นเป็น 'เท็จ'

  • ที่สอง '!' เป็นเพียงการส่งออกตรงข้ามของแรก

ดังนั้นโดยทั่วไปค่าอินพุตอาจเป็นอะไรก็ได้อาจเป็นสตริง แต่คุณต้องการเอาต์พุตบูลีนดังนั้นให้ใช้ '!' ตัวแรก ณ จุดนี้ถ้าคุณต้องการ TRUE เมื่อค่าอินพุตเป็น 'เท็จ' ให้หยุดที่นี่และใช้เพียงครั้งเดียว '!'; มิฉะนั้นถ้าคุณต้องการ TRUE เมื่อค่าอินพุตเป็น 'ความจริง' แล้วเพิ่มอีก '!'


0

ให้ดู

!$a;

แทนที่จะตีความ! ผู้ประกอบการเช่นเดียวกับการ

บูลีนตรงข้ามของค่าทางด้านขวา

อ่าน

นำบูลีนตรงข้ามกับนิพจน์ไปทางขวา

ในกรณีนี้

$a;

อาจเป็นการแสดงออก

เพื่อเป็น

!$a;

เช่นนั้น

!!$a;

และ

!!!$a;

และอื่น ๆ เนื่องจากสิ่งเหล่านี้คือการแสดงออกที่ถูกต้อง! ผู้ประกอบการสามารถได้รับการเสริมให้แต่ละคน

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