Operatore doppio (!!) non in PHP


Risposte:


291

Non è il "doppio non operatore", è il non operatore applicato due volte. Il diritto !si tradurrà in un valore booleano, indipendentemente dall'operando . Quindi la sinistra !negherà quel booleano.

Ciò significa che per qualsiasi valore vero (numeri diversi da zero, stringhe e matrici non vuote, ecc.) Otterrai il valore booleano TRUEe per qualsiasi valore falso (0, 0,0, NULLstringhe vuote o matrici vuote) otterrai il valore booleano FALSE.

Funzionalmente è equivalente a un cast per boolean:

return (bool)$row;

22
"double-not-operator" o "double non-operator" .. dipende da come lo leggi.
nickf

9
@nickf non proprio, "il doppio non operatore" si riferisce a un operatore, non all'atto di usare due volte l'operatore non.
Theo,

3
@Theo, in realtà è un operatore? L'interprete considera !!uguale (bool)in questo caso? O verrà eseguito un codice macchina diverso a seconda di quale viene utilizzato?
Pacerier

Funziona anche con JavaScript, ecco un elenco di valori falsi per Javascript ed ecco un elenco di valori falsi per PHP
Jomar Sevillejo

1
Puoi usarne quanti ne vuoi. Se c'è un numero dispari di "scoppi" (punti esclamativi) sarà un'operazione NON uguale a !value, e se c'è un numero pari di scoppi sarà lo stesso di (bool) value.
Diamondsea,

51

È lo stesso (o quasi lo stesso - potrebbe esserci un caso d'angolo) del casting da far saltare. Se $rowverrebbe lanciato su true, allora !! $rowè anche true.

Ma se vuoi raggiungere (bool) $row, probabilmente dovresti usare solo questo - e non alcune espressioni "interessanti";)


2
Grazie al fatto che in realtà ha senso, non ho mai visto qualcosa di simile in un altro linguaggio di programmazione.
Andrei,

16
L'uso !!è un'abitudine rimanente dalla programmazione in C (++). In C fare un cast non è facile come in PHP, puoi ottenere molti problemi diversi, compilare avvertimenti, così anche le persone che usano il cast per bollire !!.
NikiC,

1
@nikic - Sembra strano, IMO ... dato che operator!è sovraccarico, usarlo C++sarebbe pericoloso. Inoltre non puoi lanciare le strutture in C, o usarle !con esse. Inoltre, se qualcosa può essere negato, molto probabilmente sarai in grado di restituirlo da una funzione che restituisce int, il che lo rende praticamente un valore booleano. Sei sicuro di parlare di C?
viraptor,

2
Ho visto !! in molti programmi C come conversione sicura in 1/0. (Dato che il booleano non è altro che 0 / "non zero" in C.)
Prof. Falken,

1
@viraptor, !!non è niente di "interessante" come hai affermato. È dappertutto da C a JavaScript.
Pacerier,

18

Significa che se $rowha un valore di verità , restituirà true, altrimenti false, la conversione in un valore booleano.

Ecco le espressioni di esempio per la conversione booleana dai documenti 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

7

"non non" è un modo conveniente in molte lingue per capire quale valore di verità la lingua assegna al risultato di qualsiasi espressione. Ad esempio, in Python :

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

Può essere conveniente in luoghi in cui si desidera ridurre un valore complesso fino a qualcosa come "esiste un valore?".


1

Un altro modo più umano, forse più semplice, di "leggere" il non:

  • Il primo '!' fa 2 cose: 'converti' il valore in booleano, quindi emette il suo opposto. Quindi darà vero se il valore è "falso".

  • Il secondo '!' è solo quello di produrre l'opposto del primo.

Quindi, in sostanza, il valore di input può essere qualsiasi cosa, forse una stringa, ma vuoi un output booleano, quindi usa il primo '!'. A questo punto, se vuoi TRUE quando il valore di input è 'falsy', fermati qui e usa un solo '!'; in caso contrario, se si desidera VERO quando il valore di input è "verità", aggiungere un altro "!".


0

Guardiamo

!$a;

Invece di interpretare il! operatore come prendere il

Opposto booleano del valore alla sua destra

leggere

prendere l'opposto booleano dell'espressione alla sua destra

In questo caso

$a;

potrebbe essere un'espressione

così è

!$a;

così è

!!$a;

e

!!!$a;

e così via, poiché ognuna di queste è un'espressione valida, la! l'operatore può essere anteposto a ciascuno di essi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.