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?
$myvariable === 0
en savoir plus sur opérateurs de comparaison .
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.
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
Utilisez la fonction php is_null () function avec l'opérateur ===
. !==
fonctionne également comme vous le souhaiteriez.
Essayez ($myvariable === 0)
qui n'effectuera pas de contrainte de type.
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')
La deuxième solution ne fonctionnerait pas non plus. L'opérateur ===
est la solution à votre problème.
$myvariable===0
$a === $b
Identique VRAI si $ a est égal à $ b et qu'ils sont du même type
Il existe une fonction is_null
, mais elle ne fera que remplacer votre $myvariable!=null
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();
}