Operador double not (!!) em PHP

188

O que o operador double not faz no PHP?

Por exemplo:

return !! $row;

O que o código acima faria?

Andrei
fonte
32
Isso é essencialmente o mesmo que fazerreturn (bool) $row;
WildlyInaccurate
5
Eu queria saber qual deles é mais rápido e temos (bool) como vencedor. i.stack.imgur.com/dcnsM.png
Binod Kalathil
1
@Binod que é uma informação interessante, obrigado por isso!
Robin K

Respostas:

290

Não é o "operador não duplo", é o operador não aplicado duas vezes. O direito !resultará em um booleano, independentemente do operando . Então a esquerda !negará esse valor booleano.

Isso significa que, para qualquer valor verdadeiro (números diferentes de zero, cadeias e matrizes não vazias, etc.), você obterá o valor booleano TRUEe, para qualquer valor falso (0, 0,0, NULLcadeias vazias ou matrizes vazias), receberá o valor booleano FALSE.

É funcionalmente equivalente a um elenco para boolean:

return (bool)$row;
Theo
fonte
22
"não operador duplo" ou "operador não duplo" .. depende de como você o lê.
nickf
9
@nickf na verdade, "o operador duplo não" refere-se a um operador, não ao ato de usar o operador não duas vezes.
Theo
3
@ Theo, na verdade é um operador? O intérprete considera !!igual (bool)neste caso? Ou código de máquina diferente será executado dependendo de qual deles for usado?
Pacerier 30/03
Isso funciona para JavaScript também, aqui está uma lista de Valores Falsas para JavaScript e aqui está uma lista de Valores Falsas Para PHP
Jomar Sevillejo
1
Você pode usar quantas quiser. Se houver um número ímpar de 'estrondos' (pontos de exclamação), será uma operação NÃO igual a !value, e se houver um número par de estrondos, será o mesmo que (bool) value.
diamondsea
51

É o mesmo (ou quase o mesmo - pode haver algum caso de canto) como transmitir para bool. Se $rowconverter para verdadeiro, então!! $row também é verdade.

Mas se você deseja alcançar (bool) $row, provavelmente deve usar exatamente isso - e não algumas expressões "interessantes";)

viraptor
fonte
2
Agradeço que, na verdade, faz sentido, nunca vi algo assim em outra linguagem de programação.
Andrei
16
Usar !!é um hábito restante da programação em C (++). Em C, fazer uma conversão não é tão fácil quanto no PHP, você pode obter muitos problemas diferentes, compilar avisos, assim também !!.
NikiC 20/09/10
1
@nikic - Parece estranho, IMO ... já que operator!é sobrecarregável, usá-lo C++seria perigoso. Além disso, você não pode converter estruturas em C ou usá !-las. Além disso, se algo puder ser negado, você provavelmente poderá retorná-lo de uma função retornando int, o que o torna um valor booleano. Tem certeza de que está falando sobre C?
Viraptor 20/09/10
2
Eu tenho visto !! em muitos programas C como uma conversão segura para 1/0. (Como booleano realmente não passa de 0 / "diferente de zero" em C.)
Prof. Falken
1
@viraptor, !!não é nada "interessante" como você afirmou. Está em todo lugar, de C a JavaScript.
Pacerier 30/03
18

Isso significa que, se $rowtiver um valor verdadeiro , ele retornará true, caso contráriofalse , convertendo para um valor booleano.

Aqui estão exemplos de expressões para conversão booleana de 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
VOCÊS
fonte
7

"not not" é uma maneira conveniente em muitas línguas para entender qual valor de verdade a linguagem atribui ao resultado de qualquer expressão. Por exemplo, em Python :

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

Pode ser conveniente em locais onde você deseja reduzir um valor complexo para algo como "existe algum valor?".

Steve Bennett
fonte
1

Outra maneira mais humana, talvez mais simples, de 'ler' o não:

  • O primeiro '!' faz 2 coisas: 'converte' o valor em booleano e depois gera o seu oposto. Portanto, será verdadeiro se o valor for "falso".

  • O segundo '!' é apenas para produzir o oposto do primeiro.

Então, basicamente, o valor de entrada pode ser qualquer coisa, talvez uma string, mas você deseja uma saída booleana, então use o primeiro '!'. Nesse ponto, se você quiser VERDADEIRO quando o valor de entrada for 'falso', pare aqui e use apenas um '!'; caso contrário, se você quiser VERDADEIRO quando o valor de entrada for 'verdade', adicione outro '!'.

Luca Reghellin
fonte
0

Vamos olhar para

!$a;

Em vez de interpretar o! operador como tendo o

Booleano oposto ao valor à sua direita

ler

pegue o oposto booleano da expressão à direita

Nesse caso

$a;

poderia ser uma expressão

assim é

!$a;

assim é

!!$a;

e

!!!$a;

e assim por diante, como cada uma delas é uma expressão válida, o! operador pode ser anexado a cada um deles.

Chris Rutledge
fonte