IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Un string est-il un booléen ? Abhération


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 5
    Par défaut [Tableaux] Un string est-il un booléen ? Abhération
    Bonsoir,
    confronté à un problème dans un script, c'est l'incompréhension face à une abbération qui a suivie.

    J'utilise un foreach et je souhaite appliquer un traitement différent à la valeur correspondante à la clé 0, par le biais d'une simple expression conditionnelle.

    En toute logique et en résumé j'écris donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach($variable AS $cle => $valeur) {
          if($cle == 0) { ... }
          ...
    }
    Malgré la simplicité du code, de toutes évidences ça ne marchait pas : et pour cause, pour lui chaque clé était égale à 0 !

    J'ai donc étudié cette abbération par ces lignes de test sur les strings :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if('coucou' == 1)
        echo 'ok pour 1'."\n";
    if('coucou' == 0)
        echo 'ok pour 0'."\n";
     
    if('coucou' == true)
        echo 'ok pour true'."\n";
    if('coucou' == false)
        echo 'ok pour false'."\n";
    Ce qui affiche :
    ok pour 0
    ok pour true
    Un string, quel qu'il soit, est donc toujours égal à la valeur 0.
    Mais comme un string est évidemment qqch de toujours vrai, il est aussi égal à la valeur true.
    Mais il n'est pas par défaut égal à 1.

    Sachant que 0 correspond à false et 1 à true, pourquoi et comment un string peut-il être par défaut considéré à la fois égal à 0 et à true ?

    Pour compléter le test j'ai ensuite ajouté ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if('coucou' === 1)
        echo 'ok pour 1 en strict'."\n";
    if('coucou' === 0)
        echo 'ok pour 0 en strict'."\n";
    qui, elles, n'affichent rien.

    Il existe donc une différence entre le zéro décimal et le zéro booléen, soit.

    Ma question, si je la résume est donc : pourquoi PHP considére-t-il toutes chaines comme égale à 0, ce qui ne peut absolument pas s'expliquer par sa booléanité ?
    La ligne "if($var == 0)" est donc une abbération ?

    Merci d'avance pour vos réponses,
    ça me tracasse ^^

  2. #2
    Membre chevronné Avatar de papyphp
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 438
    Par défaut
    Bonsoir,

    Le problème vient du transtypage.
    Quand tu effectues une comparaison, php transforme les variables afin qu'elles soient comparables.

    Cas 1 : php essaye de transformer 'coucou' en integer et dans l'explication du transtypage php dit :
    Si la chaîne de caractères débute par une valeur numérique cette valeur sera celle utilisée. Sinon, la valeur sera égale à 0 (zéro).
    Donc 'coucou' égale zero

    Cas 2 : php essaye de transformer la chaine en booléen et php dit dans son aide

    Lors des conversions de valeurs de type bool, les valeurs suivantes sont considérées comme fausses (FALSE) :


    Le booléen FALSE lui-même

    L'entier 0 (zéro)

    La chaîne de caractères 0.0 (zéro)

    La chaîne de caractères vide et la chaîne de caractères "0"

    Le tableau vide (aucun élément)

    L'objet vide (aucun élément) (PHP 4 uniquement)

    Le type spécial NULL

    Toutes les autres valeurs sont considérées comme vraies (TRUE) (y compris les ressources).
    donc dans ce cas 'coucou' égale true

    Ceci n'est qu'une réflexion personnelle, il faudrait voir si réellement php transtype toujours le premier élément de la comparaison dans le type du deuxième élément

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Par défaut
    dans certain langage la comparaison de deux string ce fait pas une fonction specificque et non le ==.

    Dans ce cas si peut etre faut tt il un tel fonction?

    juste une question que je pose comme ca non une reponse a ta question

    D'ailleur j'en ai oublié qu'une telle focntion existe elle s'appelle strcmp()

    et elle fait bien sont travail d'ailleur.

  4. #4
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    c'est pour ca qu'il est souvent plus important d'utiliser l'operateur === au lieu de ==

    Toutes les reponses a tes questions sont ici :http://fr2.php.net/manual/fr/types.comparisons.php

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 5
    Par défaut
    Merci papyphp, je pense tenir mon explication.
    On peut donc ajouter que la première valeur facultative après le AS de foreach correspondant à la clé du tableau, est renvoyé sous forme de chaine et non d'entier.

    Citation Envoyé par zulot
    D'ailleur j'en ai oublié qu'une telle focntion existe elle s'appelle strcmp()
    Si je ne m'abuse cette fonction C existe uniquement parce que C(++) compare par caractère et non par suite de caractère, elle ne fait donc que comparer les caractères un à un. Enfin toutes manières au moins en C y'a pas d'ambiguïté avec les types.

    Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment savoir si un String est un Float
    Par ludovic tambour dans le forum Débuter
    Réponses: 8
    Dernier message: 14/12/2005, 13h36
  2. Savoir si un string est un numérique
    Par Homer dans le forum Langage
    Réponses: 3
    Dernier message: 05/10/2005, 16h21
  3. [C#]Fonction vérifiant qu'1 string est contenue ds 1 autre
    Par closo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/06/2005, 13h41
  4. Savoir si une string est un nombre
    Par SteelBox dans le forum SL & STL
    Réponses: 10
    Dernier message: 14/02/2005, 19h59
  5. Comment tester qu'un objet String est bien initialisé
    Par Jones dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 17/09/2004, 11h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo