Podwójnie nie (!!) operator w PHP

188

Co robi operator double not w PHP?

Na przykład:

return !! $row;

Co zrobiłby powyższy kod?

Andrei
źródło
32
Jest to w zasadzie to samo, co robieniereturn (bool) $row;
WildlyInaccurate
5
Zastanawiałem się, który z nich jest szybszy i mamy (bool) jako zwycięzcę. i.stack.imgur.com/dcnsM.png
Binod Kalathil
1
@Binod, to miło mieć informacje, dzięki za to!
Robin K,

Odpowiedzi:

291

To nie jest „double not operator”, to nie operator zastosowany dwukrotnie. Prawo !spowoduje wynik logiczny, niezależnie od operandu . Wtedy lewica !zaprzeczy, że to boolean.

Oznacza to, że dla każdej wartości prawdziwej (liczby inne niż zero, niepuste ciągi i tablice itp.) Otrzymasz wartość boolowską TRUE, a dla każdej wartości fałszywej (0, 0,0 NULL, puste ciągi lub puste tablice) otrzymasz wartość logiczna FALSE.

Jest funkcjonalnie równoważny obsadzie do boolean:

return (bool)$row;
Theo
źródło
22
„podwójny brak operatora” lub „podwójny brak operatora” zależy od tego, jak to czytasz.
nickf
9
@nickf nie jest tak naprawdę, „operator podwójnego braku” odnosi się do jednego operatora, a nie do dwukrotnego użycia operatora not.
Theo
3
@ Theo, to właściwie jeden operator? Czy w tym przypadku tłumacz uważa za !!równe (bool)? Czy może będzie uruchamiany inny kod maszynowy w zależności od tego, który jest używany?
Pacerier
Działa to również w JavaScript, oto lista Falsy Wartości dla Javascript i oto
Jomar Sevillejo
1
Możesz użyć tyle, ile chcesz. Jeśli występuje nieparzysta liczba „grzywek” (wykrzykników), będzie to operacja NIE taka sama jak !value, a jeśli jest parzysta liczba grzywek, będzie taka sama jak (bool) value.
diamondsea
51

Jest to to samo (lub prawie takie samo - może być trochę rogu) jak casting na bool. Jeśli $rowmiałoby to dotyczyć prawdy, !! $rowto również jest prawdą.

Ale jeśli chcesz to osiągnąć (bool) $row, prawdopodobnie powinieneś użyć właśnie tego - a nie niektórych „interesujących” wyrażeń;)

viraptor
źródło
2
Dzięki, że tak naprawdę ma sens, nigdy nie widziałem czegoś takiego w innym języku programowania.
Andrei
16
Używanie !!jest nawykiem pozostałym po programowaniu w C (++). W C robienie obsady nie jest tak łatwe, jak w PHP, możesz mieć wiele różnych problemów, kompilować ostrzeżenia, tak więc ludzie rzucają się na boll za pomocą !!.
NikiC,
1
@nikic - Brzmi dziwnie, IMO ... ponieważ operator!jest przeciążalny, użycie go C++byłoby niebezpieczne. Nie możesz też rzucać struktur w C ani używać !ich razem. Również jeśli coś można zanegować, najprawdopodobniej jesteś w stanie zwrócić to z funkcji zwracającej int, co w zasadzie sprawia, że ​​jest to wartość logiczna. Czy na pewno mówisz o C?
viraptor,
2
Widziałem !! w wielu programach C jako bezpieczna konwersja do 1/0. (Boolean naprawdę jest niczym innym jak 0 / „niezerową” w C.)
Prof. Falken
1
@viraptor, !!nie jest niczym „interesującym”, jak twierdziłeś. Wszędzie jest od C do JavaScript.
Pacerier
18

Oznacza to, że jeśli $rowma prawdziwą wartość, wróci true, w przeciwnym razie falseprzekształci się w wartość logiczną.

Oto przykładowe wyrażenia do konwersji boolean z dokumentów 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
TY
źródło
7

„nie nie” jest wygodnym sposobem w wielu językach dla zrozumienia, jaką wartość prawdy przypisuje językowi wynik dowolnego wyrażenia. Na przykład w Pythonie :

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

Może to być wygodne w miejscach, w których chcesz zredukować złożoną wartość do czegoś takiego jak „czy w ogóle jest jakaś wartość?”.

Steve Bennett
źródło
1

Kolejny bardziej ludzki, może prostszy sposób „odczytania” nie:

  • Pierwszy '!' robi 2 rzeczy: „przekształca” wartość na wartość logiczną, a następnie wypisuje jej przeciwieństwo. To da prawdę, jeśli wartość będzie „fałszywa”.

  • Drugi '!' jest po prostu odwrotnością pierwszego.

Zasadniczo wartość wejściowa może być dowolna, może być łańcuchem, ale chcesz otrzymać wynik logiczny, więc użyj pierwszego „!”. W tym momencie, jeśli chcesz PRAWDA, gdy wartością wejściową jest „fałsz”, zatrzymaj się tutaj i po prostu użyj pojedynczego „!”; w przeciwnym razie, jeśli chcesz PRAWDA, gdy wartość wejściowa jest „prawda”, dodaj kolejne „!”.

Luca Reghellin
źródło
0

Spójrzmy na

!$a;

Zamiast interpretować! operator jako przyjmujący

Wartość logiczna przeciwna do wartości po prawej stronie

czytać

ustaw wartość logiczną przeciwną do wyrażenia po prawej stronie

W tym przypadku

$a;

może być wyrazem

tak jest

!$a;

więc jest

!!$a;

i

!!!$a;

i tak dalej, ponieważ każde z nich jest prawidłowym wyrażeniem! operator może być dołączony do każdego z nich.

Chris Rutledge
źródło