web-dev-qa-db-fra.com

PHP considère que null est égal à zéro

En php, ($myvariable==0) Lorsque $ ma variable est égal à zéro, la valeur de l'expression est true; lorsque $ myvariable est null, la valeur de cette expression est également vraie. Comment puis-je exclure le deuxième cas? Je veux dire que je veux que l'expression ne soit vraie que lorsque $ myvariable vaut zéro. Bien sûr je peux écrire 

($myvariable!=null && $myvariable==0 )

mais y a-t-il une autre manière élégante de faire ceci?

46
Steven
$myvariable === 0

en savoir plus sur opérateurs de comparaison .

79
SilentGhost

Vous faites allusion à une question profonde: quand une expression devrait-elle être vraie?

Ci-dessous, je vais expliquer pourquoi ce que vous faites ne fonctionne pas et comment résoudre ce problème.

Dans de nombreuses langues null, 0 et la chaîne vide ("") sont tous égaux à false, cela peut rendre les instructions if assez succinctes et intuitives, mais null, 0 et "" sont également de types différents. Comment devraient-ils être comparés?

Cette page nous indique que si nous comparons deux variables, celles-ci sont converties comme suit (sortie du tableau lors de la première correspondance)

Type of First  Type of Second   Then
null/string    string           Convert NULL to "", numerical/lexical comparison
bool/null      anything         Convert to bool, FALSE < TRUE

Donc, vous comparez un zéro à un nombre. Par conséquent, le nombre nul et le nombre sont convertis en booléens. Cette page nous indique que dans une telle conversion, null et 0 sont considérés comme FALSE.

Votre expression se lit maintenant, false==false, ce qui est bien sûr vrai.

Mais pas ce que tu veux.

Cette page fournit une liste des opérateurs de comparaison de PHP.

Example   Name                Result
$a ==  $b  Equal              TRUE if $a equals $b after type juggling.
$a === $b  Identical          TRUE if $a equals $b, AND they are of the same type.
$a !=  $b  Not equal          TRUE if $a not equals $b after type juggling.
$a <>  $b  Not equal          TRUE if $a not equals $b after type juggling.
$a !== $b  Not identical      TRUE if $a not equals $b, or they are not of the same type.
$a  <  $b  Less than          TRUE if $a is strictly less than $b.
$a  >  $b  Greater than       TRUE if $a is strictly greater than $b.
$a <=  $b  Less than/equal    TRUE if $a is less than or equal to $b.
$a >=  $b  Greater than/equal TRUE if $a is greater than or equal to $b.

Le premier comparateur est la comparaison que vous utilisez maintenant. Notez qu'il effectue les conversions que j'ai mentionnées plus tôt.

L'utilisation du second comparateur résoudra votre problème. Puisqu’un null et un nombre ne sont pas du même type, la comparaison === renverra false, plutôt que d’effectuer une conversion de type comme le ferait l’opérateur ==.

J'espère que cela t'aides.

11
Richard

Identifier comme nul ou zéro par:

  • is_int($var) si une variable est un nombre ou une chaîne numérique. Pour identifier zéro, utilisez is_numeric($var) est également la solution ou utilisez $var === 0

  • is_null($var) si une variable est NULL

6
Pao Im

Utilisez la fonction php is_null () function avec l'opérateur ===. !== fonctionne également comme vous le souhaiteriez.

4
Salman A

Essayez ($myvariable === 0) qui n'effectuera pas de contrainte de type.

3
Skilldrick

Si votre zéro peut être une chaîne, vous devriez également envisager de vérifier la "chaîne zéro"

($myvariable === 0 || $myvariable === '0')
1
Thermech

La deuxième solution ne fonctionnerait pas non plus. L'opérateur === est la solution à votre problème.

1
soulmerge
$myvariable===0


$a === $b 

Identique VRAI si $ a est égal à $ b et qu'ils sont du même type

0
Haim Evgi

Il existe une fonction is_null , mais elle ne fera que remplacer votre $myvariable!=null

0
Soufiane Hassou

J'ai eu à faire face à un problème similaire dans l'un de mes projets, avec une différence mineure: j'utilisais également les valeurs ZERO en tant que valeur valide pour ma condition. voici comment je l'ai résolu en utilisant une logique simple pour séparer NULL de zéro et d'autres valeurs.

    if (gettype($company_id) === 'NULL') {
        $company = Company::where('id', Auth::user()->company_id)->first();
    } else {
        $company = Company::where('id', $company_id)->first();
    }
0
Abhishek Deshpande