2010-01-24 31 views
142

Toán tử đôi không làm gì trong PHP?Toán tử không phải (!!) trong PHP

Ví dụ:

return !! $row; 

Điều gì sẽ mã trên làm gì?

+26

Điều này về cơ bản giống như thực hiện 'trả về (bool) $ row; ' – WildlyInaccurate

+2

Tôi đã tự hỏi cái nào trong số đó nhanh hơn và chúng ta có (bool) là người chiến thắng. https://i.stack.imgur.com/dcnsM.png – Binod

Trả lời

219

Nó không phải là "đôi không điều hành", đó là các nhà điều hành không áp dụng hai lần. Bên phải ! sẽ dẫn đến boolean, bất kể toán hạng. Sau đó, bên trái ! sẽ loại bỏ boolean đó.

Điều này có nghĩa là đối với bất kỳ giá trị thực (số khác 0, không trống chuỗi và mảng, v.v.), bạn sẽ nhận được giá trị boolean TRUE và cho bất kỳ giá trị false nào (0, 0.0, NULL, chuỗi rỗng hoặc mảng trống), bạn sẽ nhận được giá trị boolean FALSE.

Đó là chức năng tương đương với một dàn diễn viên để boolean:

return (bool)$row; 
+16

"double-not-operator" hoặc "double not-operator" .. phụ thuộc vào cách bạn đọc nó. – nickf

+6

@nickf không thực sự, "toán tử kép không" dùng để chỉ một toán tử, chứ không phải hành động sử dụng toán tử không hai lần. – Theo

+2

@Theo, Đó thực sự là một toán tử? Trình thông dịch có xem xét '!!' bằng '(bool)' trong trường hợp này không? Hay mã máy khác nhau sẽ chạy tùy thuộc vào mã máy nào được sử dụng? – Pacerier

42

Nó giống nhau (hoặc gần như giống nhau - có thể có một số trường hợp góc) khi truyền tới bool. Nếu $row sẽ truyền thành true, thì !! $row cũng đúng.

Nhưng nếu bạn muốn đạt được (bool) $row, bạn nên có lẽ sử dụng điều đó - và không phải một số "thú vị" biểu;)

+1

Cảm ơn điều đó thực sự có ý nghĩa, tôi chưa bao giờ thấy một cái gì đó như thế này trong ngôn ngữ lập trình khác. – Andrei

+13

Sử dụng '!!' là một thói quen còn lại từ lập trình trong C (++). Trong C làm một diễn viên không phải là dễ dàng như trong PHP, bạn có thể nhận được nhiều vấn đề khác nhau, biên dịch cảnh báo, a.s.o. Vì vậy, mọi người dàn xếp bằng cách sử dụng '!!'. – NikiC

+1

@nikic - Nghe có vẻ lạ, IMO ... vì 'toán tử!' Là quá tải, sử dụng nó trong 'C++' sẽ là nguy hiểm. Ngoài ra, bạn không thể cast struct trong C, hoặc sử dụng '!' Với chúng. Ngoài ra nếu một cái gì đó có thể được phủ nhận, bạn có nhiều khả năng có thể trả lại nó từ một hàm trả về int, mà khá nhiều làm cho nó một boolean. Bạn có chắc là bạn đang nói về C? – viraptor

13

Nó có nghĩa là nếu $row có một giá trị truthy, nó sẽ trở lại true, nếu không false, chuyển đổi với giá trị boolean.

Dưới đây là các biểu thức ví dụ về chuyển đổi boolean từ tài liệu php.

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 
+0

Không nhất thiết. Nếu giá trị của '$ row' là 0, nó sẽ trả về' false', ví dụ. – Phiter

+1

Đã cập nhật, cảm ơn bạn – YOU

6

"không không" là một cách thuận tiện trong nhiều ngôn ngữ để hiểu những gì thật giá trị ngôn ngữ gán đến kết quả của bất kỳ biểu hiện. Ví dụ, trong Python:

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

Nó có thể được thuận tiện ở những nơi bạn muốn giảm một giá trị phức tạp xuống một cái gì đó như "là có một giá trị nào cả?".

0

Một nhân bản hơn, có lẽ đơn giản hơn, cách để 'đọc' không không: '!'

  • Đầu tiên làm 2 điều: 'chuyển' giá trị thành boolean, sau đó xuất ngược lại. Vì vậy, nó sẽ cho đúng nếu giá trị là một 'falsy'.

  • Cái thứ hai '!' chỉ là đầu ra ngược lại với cái đầu tiên.

Vì vậy, về cơ bản, giá trị đầu vào có thể được bất cứ điều gì, có thể là một chuỗi, nhưng bạn muốn có một sản lượng boolean, vì vậy sử dụng đầu tiên '!'. Tại thời điểm này, nếu bạn muốn TRUE khi giá trị đầu vào là 'falsy', thì dừng ở đây và chỉ sử dụng một '!'; nếu không, nếu bạn muốn TRUE khi giá trị đầu vào là 'truthy', hãy thêm một '!' khác.