Opérateur Double not (!!) en PHP

193

Que fait l' opérateur double not en PHP?

Par exemple:

return !! $row;

Que ferait le code ci-dessus?

Andrei
la source
32
C'est essentiellement la même chose que de fairereturn (bool) $row;
WildlyInaccurate
5
Je me demandais lequel d'entre eux est le plus rapide et nous avons (bool) comme gagnant. i.stack.imgur.com/dcnsM.png
Binod Kalathil
1
@Binod c'est une info agréable à avoir, merci pour ça!
Robin K

Réponses:

296

Ce n'est pas l'opérateur "double not", c'est l' opérateur not appliqué deux fois. La droite !donnera un booléen, quel que soit l'opérande . Ensuite, la gauche !annulera ce booléen.

Cela signifie que pour toute valeur vraie (nombres autres que zéro, chaînes et tableaux non vides, etc.), vous obtiendrez la valeur booléenne TRUE, et pour toute valeur fausse (0, 0,0, NULLchaînes vides ou tableaux vides) vous obtiendrez la valeur booléenne FALSE.

Il est fonctionnellement équivalent à un cast en boolean:

return (bool)$row;
Théo
la source
22
"double-non-opérateur" ou "double non-opérateur" .. dépend de la manière dont vous le lisez.
nickf
9
@nickf pas vraiment, "l'opérateur double not" se réfère à un opérateur, pas l'acte d'utiliser l'opérateur not deux fois.
Theo
3
@Theo, c'est en fait un opérateur? L'interprète considère-t-il !!égal à (bool)dans ce cas? Ou un code machine différent sera-t-il exécuté en fonction de celui utilisé?
Pacerier
Cela fonctionne pour JavaScript aussi, voici une liste de valeurs fausses pour Javascript et voici une liste de valeurs fausses pour PHP
Jomar Sevillejo
1
Vous pouvez en utiliser autant que vous le souhaitez. S'il y a un nombre impair de «franges» (points d'exclamation), ce sera une opération NON identique à !value, et s'il y a un nombre pair de franges, ce sera la même chose que (bool) value.
diamondsea
51

C'est la même chose (ou presque la même chose - il peut y avoir un cas d'angle) que la conversion en booléen. Si $rowserait converti en vrai, alors !! $rowest également vrai.

Mais si vous voulez y parvenir (bool) $row, vous devriez probablement utiliser juste cela - et non des expressions "intéressantes";)

viraptor
la source
2
Merci que cela a du sens, je n'ai jamais vu quelque chose comme ça dans un autre langage de programmation.
Andrei
16
L'utilisation !!est une habitude restante de la programmation en C (++). En C faire un casting est pas aussi facile en PHP, vous pouvez obtenir de nombreux problèmes, les avertissements de compilation, aso Ainsi les gens jettent à Böll en utilisant !!.
NikiC
1
@nikic - Cela semble étrange, OMI ... car il operator!est surchargeable, l'utiliser C++serait dangereux. Vous ne pouvez pas non plus convertir des structures en C ni les utiliser !avec elles. De plus, si quelque chose peut être annulé, vous êtes probablement en mesure de le renvoyer à partir d'une fonction retournant int, ce qui en fait à peu près un booléen. Êtes-vous sûr de parler de C?
viraptor
2
J'ai vu !! dans de nombreux programmes C comme une conversion sûre en 1/0. (Comme booléen n'est vraiment rien d'autre que 0 / "non zéro" en C.)
Prof. Falken
1
@viraptor, !!n'a rien d '"intéressant" comme vous l'avez prétendu. C'est partout, du C au JavaScript.
Pacerier
18

Cela signifie que si $rowa une valeur de vérité , il retournera true, sinon false, la conversion en une valeur booléenne.

Voici des exemples d'expressions de conversion booléenne à partir de documents 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
TU
la source
7

"pas non" est un moyen pratique dans de nombreuses langues pour comprendre quelle valeur de vérité la langue attribue au résultat de toute expression. Par exemple, en Python :

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

Cela peut être pratique dans les endroits où vous souhaitez réduire une valeur complexe à quelque chose comme "y a-t-il une valeur du tout?".

Steve Bennett
la source
1

Une autre façon plus humaine, peut-être plus simple, de `` lire '' le non:

  • La première '!' fait 2 choses: «convertir» la valeur en booléen, puis afficher son opposé. Donc, il donnera vrai si la valeur est «falsifiée».

  • La deuxième '!' est juste de sortir le contraire du premier.

Donc, fondamentalement, la valeur d'entrée peut être n'importe quoi, peut-être une chaîne, mais vous voulez une sortie booléenne, alors utilisez le premier '!'. À ce stade, si vous voulez TRUE lorsque la valeur d'entrée est "falsy", arrêtez-vous ici et utilisez simplement un seul "!"; sinon, si vous voulez TRUE lorsque la valeur d'entrée est «truey», ajoutez un autre «!».

Luca Reghellin
la source
0

Regardons

!$a;

Plutôt que d'interpréter le! opérateur comme prenant le

Booléen opposé à la valeur à sa droite

lis

prendre l'opposé booléen de l' expression à sa droite

Dans ce cas

$a;

pourrait être une expression

ainsi est

!$a;

ainsi est

!!$a;

et

!!!$a;

et ainsi de suite, comme chacun d'eux est une expression valide, le! opérateur peut être ajouté à chacun d'eux.

Chris Rutledge
la source