On me dit que les bons développeurs peuvent repérer / utiliser la différence entre Null
et False
et 0
et toutes les autres bonnes entités «rien».
Quelle est la différence, en particulier en PHP? Cela a-t-il quelque chose à voir avec ===
?
146
null
et quandfalse
. Je préfère utilisernull
lors de la récupération d' une valeur à partir d' une méthode, parce que je peux utiliserisset
pour déterminer si une valeur est renvoyée au lieu d'utiliserempty
qui ne prendra pas en compte:false
,0
,'0'
ou une chaîne vide, ce qui peut être des valeurs viables dans de nombreuses situations. Pour moi, c'est la solution la plus propre dans une construction désordonnée.Réponses:
C'est spécifique au langage, mais en PHP:
Null
signifie « rien ». Le var n'a pas été initialisé.False
signifie " pas vrai dans un contexte booléen ". Utilisé pour montrer explicitement que vous traitez des problèmes logiques.0
est unint
. Rien à voir avec le reste ci-dessus, utilisé pour les mathématiques.Maintenant, ce qui est délicat, c'est que dans les langages dynamiques comme PHP, tous ont une valeur dans un contexte booléen , ce qui (en PHP) l'est
False
.Si vous le testez avec
==
, il teste la valeur booléenne, vous obtiendrez donc l'égalité. Si vous le testez avec===
, il testera le type et vous obtiendrez une inégalité.Alors pourquoi sont-ils utiles?
Eh bien, regardez la
strrpos()
fonction. Il renvoie False s'il n'a rien trouvé, mais 0 s'il a trouvé quelque chose au début de la chaîne!Et bien sûr, si vous traitez avec des états:
Vous voulez faire une différence entre
DebugMode = False
(réglé sur off),DebugMode = True
(mis sur on) etDebugMode = Null
(pas du tout défini, cela conduira à un débogage dur ;-)).la source
null
estnull
.false
estfalse
. Triste mais vrai.il n'y a pas beaucoup de cohérence en PHP. les développeurs ESSAYEZ de rendre nul signifie «inconnu» ou «inexistant». mais souvent False servira de 'inexistant' (par exemple strrpos ('fail', 'search') renverra faux, et non nul)
vous verrez souvent null utilisé lorsqu'ils utilisent déjà false pour quelque chose. par exemple, filter_input (). Ils renvoient false si la variable échoue le filtre. et null si la variable n'existe pas (n'existe pas signifie qu'il a également échoué le filtre? alors pourquoi même retourner null?!?)
php a la commodité de renvoyer des données dans les fonctions. et souvent les développeurs entassent toutes sortes d'état d'échec au lieu des données.
Et il n'y a pas de moyen sensé en PHP de détecter les données (int, str, etc.) en cas d'échec (false, null)
vous devez à peu près toujours tester pour === null ou === false, selon la fonction. ou pour les deux, dans des cas tels que filter_input () / filter_var ()
et voici du plaisir avec la jonglerie de type. sans même inclure les tableaux et les objets.
la source
var_dump( null == 0 );
.0 == null
etnull == []
, mais[] != 0
!!strrpos('fail', 'search') will return false, and not null
à mon avis, c'est correct - si celanull
signifie inconnu, lestrrpos
retournull
serait comme s'il disait «Je ne sais pas si la chaîne est là» plutôt que «La chaîne n'est pas là».Voici un exemple:
Veuillez consulter ceci pour plus de références sur les comparaisons de types en PHP. Cela devrait vous donner une compréhension claire.
la source
En PHP, vous pouvez utiliser les opérateurs === et! == pour vérifier non seulement si les valeurs sont égales mais aussi si leurs types correspondent. Ainsi par exemple:
0 == false
esttrue
, mais0 === false
estfalse
. Il en va de même pour le!=
versus!==
. Aussi au cas où vous comparerieznull
aux deux autres en utilisant les opérateurs mentionnés, attendez-vous à des résultats similaires.Maintenant, en PHP, cette qualité de valeurs est généralement utilisée lors du retour d'une valeur qui peut parfois être
0
(zéro), mais parfois il se peut que la fonction ait échoué. Dans de tels cas en PHP, vous revenezfalse
et vous devez vérifier ces cas en utilisant l'opérateur d'identité===
. Par exemple, si vous recherchez une position d'une chaîne dans l'autre et que vous utilisezstrpos()
, cette fonction renverra la position numérique qui peut être 0 si la chaîne est trouvée au tout début, mais si la chaîne ne se trouve pas à tout, puisstrpos()
reviendrafalse
et vous devez en tenir compte lors du traitement du résultat.Si vous utilisez la même technique dans vos fonctions, toute personne familière avec la bibliothèque PHP standard comprendra ce qui se passe et comment vérifier si la valeur renvoyée correspond à ce qui est souhaité ou si une erreur s'est produite lors du traitement. Il en va de même pour les paramètres de fonction, vous pouvez les traiter différemment selon qu'il s'agit de tableaux ou de chaînes ou autre, et cette technique est également largement utilisée dans PHP, donc tout le monde l'obtiendra assez facilement. Alors je suppose que c'est le pouvoir.
la source
False, Null, Nothing, 0, Undefined , etc., etc.
Chacun de ceux-ci a des significations spécifiques qui correspondent aux concepts réels. Parfois, plusieurs significations sont surchargées en un seul mot-clé ou valeur.
En C et C ++ ,
NULL
,False
et0
sont surchargés à la même valeur. En C #, ce sont 3 concepts distincts.null
ouNULL
indique généralement un manque de valeur, mais ne précise généralement pas pourquoi.0
indique le nombre naturel zéro et a une équivalence de type à 1, 2, 3, etc. et dans les langues qui prennent en charge des concepts séparés deNULL
devrait être traité uniquement un nombre.Faux indique la non-vérité. Et il est utilisé dans les valeurs binaires . Cela ne veut pas dire non réglé, ni ne veut dire
0
. Il indique simplement l'une des deux valeurs binaires.Rien ne peut indiquer que la valeur est spécifiquement définie pour être rien, ce qui indique la même chose que null, mais avec intention.
Indéfini dans certaines langues indique que la valeur n'a pas encore été définie car aucun code n'a spécifié de valeur réelle.
la source
Je viens perdu 1/2 journée à essayer d'obtenir soit un
0
,null
,false
revenir destrops
!Voici tout ce que j'essayais de faire, avant de constater que la logique ne coulait pas dans la bonne direction, semblant qu'il y avait un trou noir dans le codage php:
Concept prend un nom de domaine hébergé sur un serveur, et assurez-vous qu'il n'est pas au niveau racine, OK plusieurs façons différentes de le faire, mais j'ai choisi différent en raison d'autres fonctions / constructions php que j'ai faites.
Quoi qu'il en soit, voici la base du cosing:
FINALEMENT après avoir lu ce sujet, j'ai trouvé que cela fonctionnait !!!
Merci pour cet article, je comprends maintenant que même si c'est Noël, ce n'est peut-être pas Noël car cela
false
peut aussi être unNULL
jour!Après avoir perdu une journée à déboguer un code simple, j'aurais aimé le savoir auparavant, car j'aurais pu identifier le problème, plutôt que d'aller partout pour essayer de le faire fonctionner. Il n'a pas fonctionné, comme
False
,NULL
et0
ne sont pas tous les mêmes queTrue or False or NULL
?la source
Depuis la documentation en ligne PHP :
FALSE
lui-même0.0
(zéro)"0"
NULL
(y compris les variables non définies)Toute autre valeur est prise en compte
TRUE
(y compris toute ressource).Donc, dans la plupart des cas, c'est la même chose.
En revanche, le
===
et le==
ne sont pas la même chose. Régulièrement, vous n'avez besoin que de l'opérateur "égal". Clarifier:Pour plus d'informations, consultez la page " Opérateurs de comparaison " dans la documentation en ligne PHP.
J'espère que cela t'aides.
la source
Les différences entre ces valeurs se résument toujours à des règles détaillées spécifiques à la langue. Ce que vous apprenez pour PHP n'est pas nécessairement vrai pour Python, ou Perl, ou C, etc. Bien qu'il soit utile d'apprendre les règles du ou des langages avec lesquels vous travaillez, trop compter sur eux pose des problèmes . Le problème survient lorsque le prochain programmeur a besoin de maintenir votre code et que vous avez utilisé une construction qui tire parti de quelques petits détails de Null vs False (par exemple). Votre code doit avoir l'air correct (et inversement, un code erroné doit être incorrect ).
la source
Null est utilisé dans les bases de données pour représenter «aucun enregistrement» ou «aucune information». Donc, vous pourriez avoir un petit champ qui décrit "cet utilisateur veut-il recevoir des e-mails par nous?", Où True signifie qu'il le fait, False signifie qu'il ne veut rien recevoir, mais Null signifie que vous ne le faites pas t sais. Ils peuvent provenir de jointures externes et autres.
Les implications logiques de Null sont souvent différentes - dans certaines langues, NULL n'est égal à rien, donc if (a == NULL) sera toujours faux.
Donc personnellement, je initialiserais toujours un booléen à FALSE, et en initialiser un à NULL aurait l'air un peu dégoûtant (même en C où les deux ne valent que 0 ... juste une chose de style).
la source
Je pense que les mauvais développeurs trouvent toutes les utilisations différentes de null / 0 / false dans leur code.
Par exemple, l'une des erreurs les plus courantes commises par les développeurs est de renvoyer un code d'erreur sous la forme de données avec une fonction.
Ceci est un exemple d'interface sucre. Ceci est expliqué dans le livre "Debuging the software development process" et aussi dans un autre livre "writing correct code".
Le problème avec ceci, c'est l'implication ou les hypothèses faites sur le type char. Sur certains compilateurs, le type char peut être non signé. Ainsi, même si vous retournez un -1, le compilateur peut renvoyer 1 à la place. Ces types d'hypothèses de compilateur en C ++ ou C sont difficiles à repérer.
Au lieu de cela, le meilleur moyen est de ne pas mélanger le code d'erreur avec vos données. Donc la fonction suivante.
devient maintenant
Cela signifie que peu importe le niveau de jeunesse du développeur dans votre atelier de développement, il ne se trompera jamais. Bien que cela ne parle pas de redondance ou de dépendances dans le code.
Donc, en général, échanger bool comme premier type de classe dans la langue est acceptable et je pense que Joel en a parlé avec son récent postcast. Mais essayez de ne pas utiliser de mix and match bools avec vos données dans vos routines et tout devrait être parfait.
la source
En PHP, cela dépend de la validation des types:
Techniquement nul n'est
0x00
mais en PHP( null == 0x00 ) && ( null !== 0x00 )
.0
est une valeur entière.la source
Un fait intéressant à propos
NULL
de PHP: si vous définissez une variable égale àNULL
, c'est la même chose que si vous l'aviez appeléeunset()
.NULL
signifie essentiellement qu'une variable n'a aucune valeur qui lui est assignée;false
est une valeur booléenne valide,0
est une valeur entière valide et PHP a des conversions assez laid entre0
,"0"
,""
etfalse
.la source
Null n'est rien, False est un peu et 0 est (probablement) 32 bits.
Pas un expert PHP, mais dans certains des langages les plus modernes, ceux-ci ne sont pas interchangeables. Cela me manque un peu que 0 et false soient interchangeables, mais avec booléen étant un type réel, vous pouvez avoir des méthodes et des objets associés, ce n'est donc qu'un compromis. Null est nul cependant, l'absence de quoi que ce soit essentiellement.
la source
Eh bien, je ne me souviens pas assez de mes jours PHP pour répondre à la partie "===", mais pour la plupart des langages de style C, NULL doit être utilisé dans le contexte des valeurs de pointeur, false comme booléen et zéro comme valeur numérique telle qu'un int. «\ 0» est la valeur habituelle d'un contexte de caractère. Je préfère généralement utiliser 0,0 pour les flotteurs et les doubles.
Alors ... la réponse rapide est: le contexte.
la source
Dans presque tous les langages modernes, null fait référence logiquement à des pointeurs (ou références) n'ayant pas de valeur, ou à une variable qui n'est pas initialisée. 0 est la valeur entière de zéro et false est la valeur booléenne de, eh bien, false. Pour compliquer les choses, en C, par exemple, nul, 0 et faux sont tous représentés exactement de la même manière. Je ne sais pas comment cela fonctionne en PHP.
Ensuite, pour compliquer davantage les choses, les bases de données ont un concept de null, ce qui signifie manquant ou non applicable, et la plupart des langages n'ont pas de moyen direct de mapper un DBNull à leur null. Jusqu'à récemment, par exemple, il n'y avait aucune distinction entre un int étant nul et nul, mais cela a été changé avec des entiers Nullable.
Désolé de rendre cela compliqué. C'est juste que cela a été un point de friction difficile dans les langues pendant des années, et jusqu'à récemment, il n'y avait aucune résolution claire nulle part. Les gens avaient l'habitude de simplement regrouper les éléments ou de rendre vide ou 0 représentant des valeurs nulles dans la base de données, ce qui ne fonctionne pas toujours très bien.
la source
Faux et 0 sont conceptuellement similaires, c'est-à-dire qu'ils sont isomorphes. 0 est la valeur initiale de l'algèbre des nombres naturels et False est la valeur initiale de l'algèbre booléenne.
En d'autres termes, 0 peut être défini comme le nombre qui, lorsqu'il est ajouté à un nombre naturel, donne le même nombre:
De même, False est une valeur telle qu'une disjonction de celle-ci et de toute autre valeur est la même valeur:
Null est conceptuellement quelque chose de totalement différent. Selon le langage, il existe différentes sémantiques, mais aucune d'elles ne décrit une «valeur initiale» comme False et 0 le sont. Il n'y a pas d'algèbre pour Null. Il concerne les variables, généralement pour indiquer que la variable n'a pas de valeur spécifique dans le contexte actuel. Dans la plupart des langages, aucune opération n'est définie sur Null et c'est une erreur d'utiliser Null comme opérande. Dans certains langages, il existe une valeur spéciale appelée "bottom" plutôt que "null", qui est un espace réservé pour la valeur d'un calcul qui ne se termine pas.
J'ai écrit plus en détail sur les implications de NULL ailleurs.
la source
Quelqu'un peut m'expliquer pourquoi «NULL» n'est pas simplement une chaîne dans une instance de comparaison?
la source
php > var_dump((int) "NULL"); // => int(0)
php > var_dump((int) "BLA"); // => int(0)
voir php.net/manual/en/language.operators.comparison.php Traduire des chaînes et des ressources en nombres, mathématiques habituellesLes problèmes de fausseté proviennent de l'historique PHP. Le problème cible le type scalaire mal défini.
La rigueur de PHP7 est un pas en avant, mais peut-être pas suffisant. https://web-techno.net/typing-with-php-7-what-you-shouldnt-do/
la source