Двойной не (!!) оператор в PHP

188

Что делает двойной оператор not в PHP?

Например:

return !! $row;

Что будет делать код выше?

Андрей
источник
32
По сути это то же самое, что и делатьreturn (bool) $row;
WildlyInaccurate
5
Мне было интересно, кто из них быстрее, и у нас (бул) как победитель. i.stack.imgur.com/dcnsM.png
Бинод Калатил
1
@Binod, это хорошая информация, спасибо за это!
Робин К

Ответы:

291

Это не «двойной оператор не», это не оператор применяется дважды. Право !приведет к логическому, независимо от операнда . Тогда левые !будут отрицать это логическое значение.

Это означает, что для любого истинного значения (числа, отличного от нуля, непустые строки и массивы и т. Д.) Вы получите логическое значение TRUE, а для любого ложного значения (0, 0,0 NULL, пустые строки или пустые массивы) вы получите логическое значение FALSE.

Функционально эквивалентно приведению к boolean:

return (bool)$row;
Тео
источник
22
"двойной не оператор" или "двойной не оператор" .. зависит от того, как вы читаете это.
Ник
9
@nickf не совсем, «двойной оператор not» относится к одному оператору, а не к использованию оператора not дважды.
Тео
3
@Theo, это на самом деле один оператор? Считает ли переводчик !!равным (bool)в этом случае? Или будет запущен другой машинный код в зависимости от того, какой из них используется?
Pacerier
Это работает и для JavaScript. Вот список ложных значений для Javascript и вот список ложных значений для PHP
Jomar Sevillejo
1
Вы можете использовать столько, сколько хотите. Если есть нечетное количество «взрыва» (восклицательных знаков), это будет НЕ операция !value, и если будет четное количество ударов, это будет так же, как (bool) value.
Diamondsea
51

Это то же самое (или почти то же самое - может быть какой-то угловой случай), что и приведение к bool. Если $rowбы привести к истине, то !! $rowтоже верно.

Но если вы хотите достичь (bool) $row, вы, вероятно, должны использовать именно это - а не некоторые "интересные" выражения;)

viraptor
источник
2
Спасибо, что на самом деле имеет смысл, я никогда не видел что-то подобное на другом языке программирования.
Андрей
16
Использование !!- это привычка, оставшаяся от программирования на C (++). В C делать приведение не так просто, как в PHP, вы можете получить много разных проблем, предупреждения компиляции, так что люди, таким образом, преобразуются в boll с помощью !!.
NikiC
1
@nikic - Это звучит странно, IMO ..., так operator!как перегружен, использование его в C++было бы опасно. Также вы не можете использовать структуры в Си или использовать !их. Кроме того, если что-то можно отрицать, вы, скорее всего, сможете вернуть его из функции, возвращающей int, что в значительной степени делает его логическим. Вы уверены, что говорите о Си?
вираптор
2
Я видел !! во многих программах на С в качестве безопасного преобразования в 1/0. (Поскольку логическое значение на самом деле является ничем иным, как 0 / «ненулевым» в C.)
Проф. Фалькен
1
@viraptor, !!ничего интересного, как ты так утверждал. Это повсеместно от C до JavaScript.
Пейсер
18

Это означает, что если $rowимеет истинное значение, он вернется 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, когда входное значение было «ложно», остановитесь здесь и просто используйте один «!»; в противном случае, если вы хотите TRUE, когда входное значение равно «truey», добавьте еще один «!».

Лука Регеллин
источник
0

Давайте посмотрим на

!$a;

Вместо того, чтобы интерпретировать! оператор, как принимая

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

читать

возьмите логическое противоположное выражение справа от него

В таком случае

$a;

может быть выражением

так это

!$a;

так это

!!$a;

и

!!!$a;

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

Крис Ратледж
источник