Verdoppeln Sie nicht (!!) Operator in PHP

188

Was macht der Double Not Operator in PHP?

Beispielsweise:

return !! $row;

Was würde der obige Code tun?

Andrei
quelle
32
Dies ist im Wesentlichen das gleiche wie zu tunreturn (bool) $row;
WildlyInaccurate
5
Ich habe mich gefragt, welcher von ihnen schneller ist und wir haben (bool) als Gewinner. i.stack.imgur.com/dcnsM.png
Binod Kalathil
1
@ Binod das ist eine nette Info, danke dafür!
Robin K

Antworten:

290

Es ist nicht der "doppelte Nicht-Operator", sondern der Nicht- Operator, der zweimal angewendet wird. Das Recht !führt unabhängig vom Operanden zu einem Booleschen Wert . Dann wird die Linke !diesen Booleschen Wert negieren.

Dies bedeutet, dass Sie für jeden wahren Wert (andere Zahlen als Null, nicht leere Zeichenfolgen und Arrays usw.) den booleschen Wert erhalten TRUEund für jeden falschen Wert (0, 0.0 NULL, leere Zeichenfolgen oder leere Arrays) der boolesche Wert FALSE.

Es entspricht funktional einer Besetzung für boolean:

return (bool)$row;
Das Ö
quelle
22
"double-not-operator" oder "double not-operator" .. hängt davon ab, wie Sie es lesen.
Nickf
9
@nickf nicht wirklich, "der doppelte Nicht-Operator" bezieht sich auf einen Operator, nicht auf die zweimalige Verwendung des Nicht-Operators.
Theo
3
@ Theo, es ist eigentlich ein Operator? Hat der Dolmetscher betrachtet !!gleich (bool)in diesem Fall? Oder wird je nach verwendetem Maschinencode ein anderer Maschinencode ausgeführt?
Pacerier
Dies funktioniert auch für JavaScript. Hier ist eine Liste der falschen Werte für Javascript und hier ist eine Liste der falschen Werte für PHP
Jomar Sevillejo
1
Sie können so viele verwenden, wie Sie möchten. Wenn es eine ungerade Anzahl von 'Pony' (Ausrufezeichen) gibt, ist dies eine NICHT-Operation wie bei !value, und wenn es eine gerade Anzahl von Pony gibt, ist es dieselbe wie (bool) value.
Diamondsea
51

Es ist das gleiche (oder fast das gleiche - es könnte einen Eckfall geben) wie das Casting auf Bool. Wenn $rowwürde dann wahr werden!! $row ist es auch wahr.

Aber wenn Sie erreichen wollen (bool) $row, sollten Sie wahrscheinlich genau das verwenden - und nicht einige "interessante" Ausdrücke;)

Viraptor
quelle
2
Vielen Dank, dass dies tatsächlich Sinn macht. Ich habe so etwas noch nie in einer anderen Programmiersprache gesehen.
Andrei
16
Die Verwendung !!ist eine Gewohnheit, die beim Programmieren in C (++) verbleibt. In C ist das Ausführen eines Casts nicht so einfach wie in PHP. Sie können viele verschiedene Probleme bekommen, Warnungen kompilieren und so weiter !!.
NikiC
1
@nikic - Es klingt seltsam, IMO ... da operator!es überladbar ist, C++wäre es gefährlich, es zu verwenden. Sie können Strukturen auch nicht in C umwandeln oder !mit ihnen verwenden. Auch wenn etwas negiert werden kann, können Sie es höchstwahrscheinlich von einer Funktion zurückgeben, die int zurückgibt, was es so ziemlich zu einem Booleschen Wert macht. Bist du sicher, dass du über C sprichst?
Viraptor
2
Ich habe gesehen !! in vielen C-Programmen als sichere Konvertierung in 1/0. (Da Boolescher Wert in C. wirklich nichts als 0 / "nicht Null" ist)
Prof. Falken
1
@viraptor, !!ist nichts "Interessantes", wie Sie so behauptet haben. Es ist überall von C bis JavaScript.
Pacerier
18

Es bedeutet, wenn $rowes einen wahrheitsgemäßen Wert hat, wird es zurückkehrentrue und andernfalls falsein einen booleschen Wert konvertiert.

Hier sind Beispielausdrücke für die boolesche Konvertierung aus PHP-Dokumenten.

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
SIE
quelle
7

"nicht nicht" ist in vielen Sprachen ein bequemer Weg, um zu verstehen, welchen Wahrheitswert die Sprache dem Ergebnis eines Ausdrucks zuweist. Zum Beispiel in Python :

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

Dies kann praktisch sein, wenn Sie einen komplexen Wert auf "Gibt es überhaupt einen Wert?" Reduzieren möchten.

Steve Bennett
quelle
1

Eine andere menschlichere, vielleicht einfachere Art, das Nicht-Nicht-Lesen zu "lesen":

  • Der Erste '!' macht zwei Dinge: 'konvertiere' den Wert in einen Booleschen Wert und gebe dann das Gegenteil aus. Es wird also wahr sein, wenn der Wert "falsch" ist.

  • Der Zweite '!' ist nur das Gegenteil des ersten auszugeben.

Im Grunde kann der Eingabewert also alles sein, vielleicht eine Zeichenfolge, aber Sie möchten eine boolesche Ausgabe, verwenden Sie also das erste '!'. Wenn Sie an dieser Stelle TRUE möchten, wenn der Eingabewert "falsy" ist, hören Sie hier auf und verwenden Sie einfach ein einzelnes "!". Andernfalls, wenn Sie TRUE möchten, wenn der Eingabewert "wahr" ist, fügen Sie ein weiteres "!" hinzu.

Luca Reghellin
quelle
0

Schauen wir uns das an

!$a;

Anstatt das zu interpretieren! Betreiber als nehmen die

Boolesches Gegenteil des Wertes rechts davon

lesen

Nimm das Boolesche Gegenteil des Ausdrucks rechts davon

In diesem Fall

$a;

könnte ein Ausdruck sein

so zu ist

!$a;

so ist es

!!$a;

und

!!!$a;

und so weiter, da jeder von diesen ein gültiger Ausdruck ist, ist das! Operator kann jedem von ihnen vorangestellt werden.

Chris Rutledge
quelle