Verdoppeln Sie nicht (!!) Operator in PHP


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;

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;)


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

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.


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.


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.