Question

On me dit que les bons développeurs peuvent repérer / utiliser la différence entre Null et False et 0 et tous les autres bons "rien". ; entités.
Quelle est la différence , en particulier en PHP? Cela a-t-il quelque chose à voir avec === ?

Était-ce utile?

La solution

Cela dépend du langage, mais en PHP:

Null signifie " rien ". La var n'a pas été initialisée.

False signifie " faux dans un contexte booléen ". Utilisé pour montrer explicitement que vous avez affaire à des problèmes logiques.

0 est un int . 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 , qui (en PHP) est False .

Si vous le testez avec == , il teste la valeur booléenne afin que vous obteniez une égalité. Si vous le testez avec === , le type sera testé et vous obtiendrez une inégalité.

Alors, pourquoi sont-ils utiles?

Regardez la fonction strrpos () . Il renvoie False s'il n'a rien trouvé, mais 0 s'il a trouvé quelque chose au début de la chaîne!

<?php
// pitfall :
if (strrpos("Hello World", "Hello")) { 
    // never exectuted
}

// smart move :
if (strrpos("Hello World", "Hello") !== False) {
    // that works !
}
?>

Et bien sûr, si vous traitez avec des états:

Vous souhaitez différencier DebugMode = False (désactivé), DebugMode = True (activé) et DebugMode = Null (pas défini du tout, conduira à un débogage difficile; -)).

Autres conseils

null est null . false est false . Triste mais vrai.

il n’ya pas beaucoup de cohérence en PHP. les développeurs ESSAYER de faire en sorte que null signifie "inconnu". ou "inexistant". mais souvent False servira de "non-existant" (par exemple, strrpos ("fail", "search") retournera false et non null)

vous verrez souvent que null est utilisé alors qu’ils utilisent déjà false pour quelque chose. par exemple. filter_input (). Ils renvoient false si la variable échoue avec le filtre. et null si la variable n’existe pas (n’existe pas, cela signifie également qu’il a échoué le filtre? alors pourquoi même renvoyer null?!?)

php a la commodité de renvoyer des données dans les fonctions. et ofter les développeurs entasser dans tout type d'état d'échec au lieu des données.

Et en PHP, il n’existe aucun moyen sain de détecter les données (int, str, etc.) des échecs (false, null)

vous devez toujours toujours tester === null ou === false, selon la fonction. ou pour les deux, dans des cas tels que filter_input () / filter_var ()

et voici du plaisir à jongler avec des caractères. sans même inclure les tableaux et les objets.

var_dump( 0<0 );        #bool(false)
var_dump( 1<0 );        #bool(false)
var_dump( -1<0 );       #bool(true)
var_dump( false<0 );    #bool(false)
var_dump( null<0 );     #bool(false)
var_dump( ''<0 );       #bool(false)
var_dump( 'a'<0 );      #bool(false)
echo "\n";
var_dump( !0 );        #bool(true)
var_dump( !1 );        #bool(false)
var_dump( !-1 );       #bool(false)
var_dump( !false );    #bool(true)
var_dump( !null );     #bool(true)
var_dump( !'' );       #bool(true)
var_dump( !'a' );      #bool(false)
echo "\n";
var_dump( false == 0 );        #bool(true)
var_dump( false == 1 );        #bool(false)
var_dump( false == -1 );       #bool(false)
var_dump( false == false );    #bool(true)
var_dump( false == null );     #bool(true)
var_dump( false == '' );       #bool(true)
var_dump( false == 'a' );      #bool(false)
echo "\n";
var_dump( null == 0 );        #bool(true)
var_dump( null == 1 );        #bool(false)
var_dump( null == -1 );       #bool(false)
var_dump( null == false );    #bool(true)
var_dump( null == null );     #bool(true)
var_dump( null == '' );       #bool(true)
var_dump( null == 'a' );      #bool(false)
echo "\n";
$a=0; var_dump( empty($a) );        #bool(true)
$a=1; var_dump( empty($a) );        #bool(false)
$a=-1; var_dump( empty($a) );       #bool(false)
$a=false; var_dump( empty($a) );    #bool(true)
$a=null; var_dump( empty($a) );     #bool(true)
$a=''; var_dump( empty($a) );       #bool(true)
$a='a'; var_dump( empty($a));      # bool(false)
echo "\n"; #new block suggested by @thehpi
var_dump( null < -1 ); #bool(true)
var_dump( null < 0 ); #bool(false)
var_dump( null < 1 ); #bool(true)
var_dump( -1 > true ); #bool(false)
var_dump( 0 > true ); #bool(false)
var_dump( 1 > true ); #bool(true)
var_dump( -1 > false ); #bool(true)
var_dump( 0 > false ); #bool(false)
var_dump( 1 > true ); #bool(true)

Voici un exemple:

            Comparisons of $x with PHP functions

Expression          gettype()   empty()     is_null()   isset() boolean : if($x)
$x = "";            string      TRUE        FALSE       TRUE    FALSE
$x = null;          NULL        TRUE        TRUE        FALSE   FALSE
var $x;             NULL        TRUE        TRUE        FALSE   FALSE
$x is undefined     NULL        TRUE        TRUE        FALSE   FALSE
$x = array();       array       TRUE        FALSE       TRUE    FALSE
$x = false;         boolean     TRUE        FALSE       TRUE    FALSE
$x = true;          boolean     FALSE       FALSE       TRUE    TRUE
$x = 1;             integer     FALSE       FALSE       TRUE    TRUE
$x = 42;            integer     FALSE       FALSE       TRUE    TRUE
$x = 0;             integer     TRUE        FALSE       TRUE    FALSE
$x = -1;            integer     FALSE       FALSE       TRUE    TRUE
$x = "1";           string      FALSE       FALSE       TRUE    TRUE
$x = "0";           string      TRUE        FALSE       TRUE    FALSE
$x = "-1";          string      FALSE       FALSE       TRUE    TRUE
$x = "php";         string      FALSE       FALSE       TRUE    TRUE
$x = "true";        string      FALSE       FALSE       TRUE    TRUE
$x = "false";       string      FALSE       FALSE       TRUE    TRUE

Veuillez voir ceci pour plus de références sur les comparaisons de types en PHP. Cela devrait vous donner une compréhension claire.

En PHP, vous pouvez utiliser les opérateurs === et! == pour vérifier non seulement si les valeurs sont égales, mais également si leurs types correspondent. Ainsi, par exemple: 0 == faux est vrai , mais 0 === faux est faux . Il en va de même pour ! = par rapport à ! == . De même, si vous comparez null aux deux autres à l'aide des opérateurs mentionnés, attendez-vous à des résultats similaires.

Or, en PHP, cette qualité de valeur est généralement utilisée pour renvoyer une valeur qui peut parfois être 0 (zéro), mais il peut arriver que la fonction échoue. Dans de tels cas, en PHP, vous retournez false et vous devez vérifier ces cas à l'aide de l'opérateur d'identité === . Par exemple, si vous recherchez la position d’une chaîne dans l’autre et que vous utilisez strpos () , cette fonction renverra la position numérique qui peut être 0 si la chaîne se trouve tout à la fois. commençant, mais si la chaîne n’est pas trouvée du tout, alors strpos () renverra false et vous devrez en tenir compte lors du traitement du résultat.

Si vous utilisez la même technique dans vos fonctions, toute personne familiarisée avec la bibliothèque PHP standard comprendra ce qui se passe et comment vérifier si la valeur renvoyée correspond à ce qui est voulu 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 de caractères ou non, et cette technique est aussi très utilisée dans PHP, ainsi tout le monde l’obtiendra facilement. Donc, je suppose que c'est le pouvoir.

False, Null, Nothing, 0, Indéfini , etc., etc.

Chacun de ceux-ci a des significations spécifiques qui correspondent aux concepts actuels. Parfois, plusieurs significations sont surchargées dans un même mot clé ou une seule valeur.

Dans C et C ++ , NULL , Faux et 0 sont surchargés. à la même valeur. Dans C # , il existe 3 concepts distincts.

null ou NULL indique généralement un manque de valeur, mais n'indique généralement pas pourquoi. 0 indique le nombre naturel zéro et a une équivalence de type de 1, 2, 3, , etc., ainsi que dans des langues prenant en charge des concepts distincts de NULL . devrait être traité seulement un nombre.

False indique une non-vérité. Et cela a été utilisé dans les valeurs binaires . Cela ne signifie pas non défini, ni 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 qui indique la même chose que null, mais avec intention.

Undefined 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.

Je viens de perdre une demi-journée à essayer d'obtenir un 0 , null , false à renvoyer à strops !

Voici tout ce que j'essayais de faire, avant de constater que la logique ne fonctionnait pas dans la bonne direction, semblant avoir un trou noir dans le codage php:

Concept prenez un nom de domaine hébergé sur un serveur, et assurez-vous que ce n'est pas le niveau racine, OK de différentes manières pour le faire, mais j'ai choisi différent en raison des autres fonctions / constructions php que j'ai effectuées.

En tout cas, voici la base du cosing:

if (strpos(

Je viens de perdre une demi-journée à essayer d'obtenir un 0 , null , false à renvoyer à strops !

Voici tout ce que j'essayais de faire, avant de constater que la logique ne fonctionnait pas dans la bonne direction, semblant avoir un trou noir dans le codage php:

Concept prenez un nom de domaine hébergé sur un serveur, et assurez-vous que ce n'est pas le niveau racine, OK de différentes manières pour le faire, mais j'ai choisi différent en raison des autres fonctions / constructions php que j'ai effectuées.

En tout cas, voici la base du cosing:

{
if ((mydomain.co.uk, mydomain)) !== false ) 
    {
        echo "\n5 is True"; 
    } else {
        echo "\n5 is False"; 
    }
}

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, il se peut que ce ne soit pas Noël comme false , car cela peut également être un jour NULL !

Après avoir perdu une journée de débogage avec un code simple, j'aurais souhaité le savoir auparavant, car j’aurais été en mesure d’identifier le problème plutôt que d’aller partout pour essayer de le faire fonctionner. Cela n'a pas fonctionné, car False , NULL et 0 ne sont pas tous identiques à True ou False ou NULL ?

SERVER ['SERVER_NAME'], dirBaseNAME ()) { do this } else { or that } { echo strpos(mydomain.co.uk, mydomain); if ( strpos(mydomain, xmas) == null ) { echo "\n1 is null"; } if ( (strpos(mydomain.co.uk, mydomain)) == 0 ) { echo "\n2 is 0"; } else { echo "\n2 Something is WRONG"; } if ( (mydomain.co.uk, mydomain)) != 0 ) { echo "\n3 is 0"; } else { echo "\n3 it is not 0"; } if ( (mydomain.co.uk, mydomain)) == null ) { echo "\n4 is null"; } else { echo "\n4 Something is WRONG"; } }

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, il se peut que ce ne soit pas Noël comme false , car cela peut également être un jour NULL !

Après avoir perdu une journée de débogage avec un code simple, j'aurais souhaité le savoir auparavant, car j’aurais été en mesure d’identifier le problème plutôt que d’aller partout pour essayer de le faire fonctionner. Cela n'a pas fonctionné, car False , NULL et 0 ne sont pas tous identiques à True ou False ou NULL ?

Extrait de la documentation en ligne de PHP :

  

Pour convertir explicitement une valeur en booléen, utilisez les conversions (bool) ou (boolean).
  Toutefois, dans la plupart des cas, la conversion n’est pas nécessaire, puisqu’une valeur sera automatiquement convertie si un opérateur, une fonction ou une structure de contrôle nécessite un argument booléen.
  Lors de la conversion en booléen, les valeurs suivantes sont considérées comme FALSE:

  • le booléen FALSE lui-même
  • le nombre entier `` 0 (zéro)
  • le flottant 0.0 (zéro)
  • la chaîne vide et la chaîne "0"
  • un tableau avec zéro élément
  • un objet avec zéro variable membre (PHP 4 uniquement)
  • le type spécial NULL (y compris les variables non définies)
  • Objets SimpleXML créés à partir de balises vides
    Toute autre valeur est considérée comme TRUE (y compris les ressources).

Donc, dans la plupart des cas, c'est la même chose.

D'autre part, le === et le == ne sont pas la même chose. Régulièrement, vous avez simplement besoin de la valeur "égal à". opérateur. Pour clarifier:

$a == $b    //Equal. TRUE if $a is equal to $b.
$a === $b   //Identical. TRUE if $a is equal to $b, and they are of the same type. 

Pour plus d'informations, consultez les " opérateurs de comparaison " page dans la documentation en ligne de PHP.

J'espère que cela vous aidera.

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 pour la (les) langue (s) avec laquelle vous travaillez, vous en faire trop, c’est trop demander. . Le problème vient du moment où le prochain programmeur doit gérer votre code et que vous avez utilisé une construction qui tire parti de quelques détails mineurs tels que Null et False (par exemple). Votre code doit avoir l’air correct (et au contraire, un code incorrect doit avoir l’air faux ).

Null est utilisé dans les bases de données pour représenter " no record " ou "aucune information". Donc, vous pourriez avoir un champ de bits décrivant "cet utilisateur veut-il recevoir des courriels par nous", où Vrai veut dire qu'ils veulent, Faux signifie qu'ils ne veulent rien recevoir, mais Null voudrait que vous ne le fassiez pas. 't sais. Ils peuvent se réaliser par des jointures externes et autres.

Les implications logiques de Null sont souvent différentes: dans certaines langues, NULL n’est égal à rien, donc si (a == NULL) sera toujours faux.

Personnellement, j’initialisais toujours un booléen sur FALSE, et en initialiser un sur NULL aurait un aspect un peu dégoûtant (même en C où les deux ne sont que 0 ... juste un truc de style).

Je pense que les mauvais développeurs trouvent les différentes utilisations de null / 0 / false dans leur code.

Par exemple, l'une des erreurs les plus courantes commises par les développeurs consiste à renvoyer un code d'erreur sous la forme de données comportant une fonction.

// On error GetChar returns -1
int GetChar()

Ceci est un exemple d'interface sucre. Ceci est expliqué dans le livre "Débogage du processus de développement logiciel". et aussi dans un autre livre "en écrivant le code correct".

Le problème, c’est l’implication ou les hypothèses retenues sur le type de caractère. Sur certains compilateurs, le type char peut être non signé. Ainsi, même si vous retournez -1, le compilateur peut renvoyer 1 à la place. Ce type d’hypothèses de compilation en C ++ ou C est difficile à 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.

char GetChar()

devient maintenant

// On success return 1
// on failure return 0
bool GetChar(int &char)

Cela signifie que peu importe la taille 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, permuter avec bool en tant que premier type de classe est correct et je pense que joel en a parlé dans son postcast récent. Mais essayez de ne pas utiliser mix and match bools avec vos données dans vos routines et vous devriez aller parfaitement.

En PHP, cela dépend de la validation des types:

( 
 ( false !== 0 ) && ( false !== -1 ) && ( false == 0 ) && ( false == -1 ) &&
 ( false !== null ) && ( false == null ) 
)

Techniquement, null est 0x00 mais en PHP (null == 0x00) & amp; & amp; (null! == 0x00) .

0 est une valeur entière.

Un fait intéressant à propos de NULL en PHP: Si vous définissez un var égal à NULL , il en va de même si vous aviez appelé unset () dessus.

NULL signifie essentiellement qu'une variable n'a pas de valeur assignée; false est une valeur booléenne valide, 0 est un nombre entier valide et PHP présente des conversions assez laides entre 0 , " 0 ", " " et faux .

Null n'est rien, False est un bit et 0 est (probablement) 32 bits.

Pas un expert en PHP, mais dans certains des langages les plus modernes, ceux-ci ne sont pas interchangeables. J'ignore que 0 et false sont interchangeables, mais avec un type booléen, vous pouvez associer des méthodes et des objets, ce qui n'est donc qu'un compromis. Null est nul cependant, l'absence de quoi que ce soit essentiellement.

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 en tant que booléen et zéro en tant que valeur numérique, telle que int. '\ 0' est la valeur habituelle pour un contexte de caractère. En général, je préfère également utiliser 0,0 pour les flotteurs et les doubles.

Donc ... la réponse rapide est: contexte.

Dans à peu près toutes les langues modernes, null logiquement fait référence à des pointeurs (ou références) n'ayant pas de valeur ou à une variable non initialisée. 0 est la valeur entière de zéro et False la valeur booléenne de, eh bien, false. Pour compliquer les choses, en C, par exemple, null, 0 et false sont tous représentés exactement de la même manière. Je ne sais pas comment ça marche 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 langues n’ont pas de moyen direct de mapper un DBNull sur leur null. Jusqu'à récemment, par exemple, il n'y avait pas de distinction entre un int égal à zéro et un zéro, mais cela a été changé avec un int nullable.

Désolé de rendre ce son compliqué. C'est simplement que cela a été un point d'achoppement harry 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 faire des choses ensemble ou de laisser des blancs ou des 0 ou des nuls dans la base de données, ce qui ne fonctionne pas toujours très bien.

False 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, ajouté à un nombre naturel, donne le même nombre:

x + 0 = x

De même, False est une valeur telle qu'une disjonction de celle-ci et de toute autre valeur correspond à la même valeur:

x || False = x

Null est conceptuellement quelque chose de totalement différent. Selon la langue, il existe différentes sémantiques, mais aucune d’elles ne décrit une "valeur initiale". comme False et 0 are. Il n'y a pas d'algèbre pour Null. Cela 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 en tant qu'opérande. Dans certaines langues, 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 de manière plus détaillée sur les implications de NULL ailleurs.

Quelqu'un peut m'expliquer pourquoi "NULL" n'est pas simplement une chaîne dans une instance de comparaison?

$x = 0;
var_dump($x == 'NULL');  # TRUE   !!!WTF!!!

Les problèmes de falsyness proviennent de l’historique de PHP. Le problème concerne le type scalaire mal défini.

'*' == true -> true (string match)
'*' === true -> false (numberic match)

(int)'*' == true -> false
(string)'*' == true -> true

La rigueur de PHP7 est un pas en avant, mais peut-être pas suffisant. https://web-techno.net/typing -with-php-7-ce que vous ne devriez pas faire /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top