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 :

Différence entre égalité et identité [PHP 5.3]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Par défaut Différence entre égalité et identité
    Bonjour,

    Je suis tomber sur l'exemple ci-après pour expliquer la différence entre égalité et identité dans le livre PHP5 avancé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php 
     
    class test {
      public $public = 1;  
    }
     
    $a = new test();
    $b = $a;
    $c =& $b;
     
    if($a == $b) echo '$a est égal à $b <br>';
    if($b == $c) echo '$b est égal à $c <br>';
    if($a === $b) echo '$a est une référence de $b <br>'; 
    if($b === $c) echo '$b est une référence de $c <br>';
    ?>
    Résultat :

    $a est égal à $b
    $b est égal à $c
    $a est une référence de $b
    $b est une référence de $c
    Je sais que ce résultat est juste mais je ne comprend pas le : "$a est une référence de $b" alors qu'on ne passe pas $a à $b par référence.
    Est-ce que quelqu'un pourrait m'expliquez ?

    Merci.

  2. #2
    Membre Expert Avatar de Bebel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2003
    Messages : 786
    Par défaut
    Salut,

    pour moi le === vérifie la valeur et le type.

    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    $a = 1
    $b = true
     
    if ($a == true) echo '$a est vrai'; else; echo '$a est faux'; affiche vrai
    if ($a == true) echo '$a est vrai'; else; echo '$a est faux'; affiche faux
    if ($b == true) echo '$b est vrai'; else; echo '$b est faux'; affiche vrai
    if ($b == true) echo '$b est vrai'; else; echo '$b est faux'; affiche vrai
    edit: reference sur php.net ici

    j'ai pas mémoire d'histoire de référence au sujet du triple =

  3. #3
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Citation Envoyé par philodido Voir le message
    Je sais que ce résultat est juste mais je ne comprend pas le : "$a est une référence de $b" alors qu'on ne passe pas $a à $b par référence.
    Est-ce que quelqu'un pourrait m'expliquez ?
    Quand on manipule des instances, tout passe par référence par défaut à l'inverse des types natifs (string, int, float, array...) qui eux se manipulent par copie pour 99% des fonctions.
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $a = new Test(): // instance de classe
    $b = $a; // $b pointe vers $a
    $b =& $a; // ici le =& est inutile car $a est une instance d'une classe et sera toujours passée par référence

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Voici une explication simple pour les types natifs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
     
    $a = 'a';   // $a = 'a'
    $b = $a;    // $b = 'a' (copie de $a)
    $b = 'b';   // $a = 'a' et $b = 'b'
     
    $a = 'a';
    $b =& $a;   // $b = 'a' ($b pointe vers le même emplacement mémoire que $a)
    $a = 'x';   // $b = 'x'
     
    ?>

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $a = new Test(): // instance de classe
    $b = $a; // $b pointe vers $a
    $b =& $a; // ici le =& est inutile car $a est une instance d'une classe et sera toujours passée par référence
    oui et non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $a = new stdClass();
    $a->test = 'hello';
     
    $b = $a;
    $c = & $a;
     
    $a->test = 'hi';
     
    $a = null;
     
    var_dump($a, $b, $c);
     
    /*
    NULL
    object(stdClass)#1 (1) {
      ["test"]=>
      string(2) "hi"
    }
    NULL
    */

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Oups,

    Oui j'ai oublié qu'en PHP les pointeurs (au sens du C) n'existent pas. Les références ne sont en fait que des alias des variables référencées.
    stealth35rawsrc

  7. #7
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Par défaut
    Je comprend pas l'exemple de stealth35, pourquoi $b n'est pas NULL comme $a et $c alors que $a en tant qu'instance est passé en référence à $b ?

    Que $b->test devienne égal à 'hi' quand $a->test devient égal à 'hi', ça se tient, mais pourquoi ne devient t-il pas NULL lorsque $a devient NULL ?

  8. #8
    Membre émérite
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 606
    Par défaut
    Citation Envoyé par philodido Voir le message
    Je comprend pas l'exemple de stealth35, pourquoi $b n'est pas NULL comme $a et $c alors que $a en tant qu'instance est passé en référence à $b ?
    Non dans l'exemple de stealth $a n'est pas passé en référence à $b mais à $c

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

Discussions similaires

  1. Différence entre un "bidouilleur" et un Pro ?
    Par christ_mallet dans le forum Débats sur le développement - Le Best Of
    Réponses: 290
    Dernier message: 28/11/2011, 10h53
  2. Réponses: 5
    Dernier message: 11/12/2002, 12h31
  3. Différence entre TCP, UDP, ICMP
    Par GliGli dans le forum Développement
    Réponses: 1
    Dernier message: 13/09/2002, 08h25
  4. Différences entre jmp, jz, jnz, etc
    Par christbilale dans le forum Assembleur
    Réponses: 3
    Dernier message: 05/07/2002, 15h09
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

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