Подвійний не (!!) оператор в PHP


188

Що робить подвійний не оператор у PHP?

Наприклад:

return !! $row;

Що б зробити код вище?


32
Це по суті те саме, що робитиreturn (bool) $row;
WildlyIcucurate

5
Мені було цікаво, хто з них швидший, і ми маємо (bool) як переможець. i.stack.imgur.com/dcnsM.png
Kalathil

1
@Binod, це приємна інформація, спасибі за це!
Робін К

Відповіді:


291

Це не "подвійний не оператор", це не оператор, що застосовується двічі. Право !призведе до булевого значення, незалежно від операнду . Тоді зліва !відкине цю булеву.

Це означає, що для будь-якого справжнього значення (числа, крім нуля, непусті рядки та масиви тощо) ви отримаєте булеве значення TRUE, а для будь-якого помилкового значення (0, 0,0 NULL, порожні рядки або порожні масиви) ви отримаєте булеве значення FALSE.

Він функціонально еквівалентний амплуа boolean:

return (bool)$row;

22
"подвійний не оператор" або "подвійний не оператор" .. залежить від того, як ви його прочитали.
нікфф

9
@nickf насправді, "оператор подвійний не" посилається на одного оператора, а не акт використання оператора не двічі.
Тео

3
@Theo, це насправді один оператор? Чи вважає перекладача !!рівним (bool)у цьому випадку? Або буде запускатися інший машинний код залежно від того, який з них використовується?
Pacerier

Це працює і для JavaScript. Ось список фальшивих значень для Javascript і ось список хибних значень для PHP
Джомар Севільйо,

1
Ви можете використовувати скільки завгодно. Якщо є непарна кількість «чубків» (знаків оклику), це буде НЕ така ж операція, як !value, і якщо є парна кількість чуб, то це буде те саме, що (bool) value.
diamondsea

51

Це те саме (або майже те саме - може бути якийсь кутовий випадок), як і лиття в bool. Якщо $rowбуло б приведено до істини, то !! $rowтакож є правдою.

Але якщо ви хочете досягти (bool) $row, ви, ймовірно, повинні використовувати саме це - а не якісь "цікаві" вирази;)


2
Дякую, що насправді має сенс, я не бачив такого подібного в іншій мові програмування.
Андрій

16
Використання !!- це звичка, що залишається від програмування на C (++). У C ролях робити не так просто, як у PHP, ви можете отримати багато різних проблем, скласти попередження, aso. Таким чином, люди кидають на роботу, використовуючи !!.
NikiC

1
@nikic - Це звучить дивно, IMO ... оскільки operator!це C++може бути завантажено, використовувати його в було б небезпечно. Також ви не можете викидати структури в C або використовувати !з ними. Крім того, якщо щось можна заперечувати, ви, швидше за все, зможете повернути це з функції, що повертається до int, що в значній мірі робить його булевим. Ви впевнені, що говорите про C?
viraptor

2
Я бачив !! у багатьох програмах С як безпечне перетворення на 1/0. (Оскільки булевий насправді є нічим іншим, як 0 / "не нульовим" у C.)
Проф. Фолкен,

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, коли вхідне значення "truthy", тоді додайте інше "!".


0

Давайте подивимось

!$a;

Замість того, щоб інтерпретувати! оператор як приймає

Булеві протилежні значення праворуч

читати

прийняти булеву протилежність виразу праворуч

В цьому випадку

$a;

може бути виразом

так і є

!$a;

так і є

!!$a;

і

!!!$a;

і так далі, оскільки кожен з них є дійсним виразом,! Оператор може бути попередньо до кожного з них.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.