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

  1. #1
    Membre averti
    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
    Points : 342
    Points
    342
    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 éprouvé Avatar de Bebel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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
    Points : 1 262
    Points
    1 262
    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 éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 16 545
    Points
    16 545
    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 éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 16 545
    Points
    16 545
    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 éminent sénior

    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
    Points : 10 727
    Points
    10 727
    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 éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 16 545
    Points
    16 545
    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 averti
    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
    Points : 342
    Points
    342
    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 éprouvé
    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
    Points : 1 057
    Points
    1 057
    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

  9. #9
    Membre averti
    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
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par amoiraud Voir le message
    Non dans l'exemple de stealth $a n'est pas passé en référence à $b mais à $c
    Je ne comprend plus rien ... alors est ce que ce que dit rawsrc est faux ?
    Quand on manipule des instances, tout passe par référence par défaut
    ou encore
    $a est une instance d'une classe et sera toujours passée par référence
    Et pourquoi : "$a est une référence de $b" dans mon premier post.

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Allez je vais essayer de me rattraper, PHP a une subtilité dans le gestion des références.
    Reprenons le code de stealth35 avec ce schéma :



    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
    21
    22
    23
    24
    25
    26
    27
    $a = new stdClass();
    $a->test = 'hello';
     
    $b = $a;    // $b est une référence de l'instance de classe pointée par $a et un alias de la variable $a ($a n'est pas dupliquée)
    $c = & $a;  // $c est une référence (pure) de $a => $c pointe directement vers l'emplacement mémoire de $a
     
    $a->test = 'hi';  
     
    $a = null;  // $a est réinitialisé donc la référence qui pointe vers l'instance de classe est détruite
                // $c qui pointe directement vers l'emplacement mémoire de $a est lui aussi réinitialisé
                // par contre $b garde indépendamment un lien avec l'instance de classe (c'est juste un simple alias de $a)
     
     
    var_dump($a, $b, $c);
     
    // ici $a et $c valent bien NULL
    // par contre l'instance de classe ayant gardé une variable ($b) qui 
    // continue de la référencer n'est pas détruite et c'est pour ça que $b n'est pas NULL
     
    /*
    NULL
    object(stdClass)#1 (1) {
      ["test"]=>
      string(2) "hi"
    }
    NULL
    */
    En conclusion, oups et re-oups. Il y a bien un intéret à utiliser les =& même pour les instances de classes. (Bon, j'avoue n'avoir jamais eu besoin de l'utiliser).
    En espérant avoir levé toute ambiguïté ce coup-ci.

  11. #11
    Membre averti
    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
    Points : 342
    Points
    342
    Par défaut
    Wahou ! Je vais regarder ta réponse très attentivement plus tard parce que là tout de suite il y a plein de questions qui me viennent et j'ai pas le temps de faire le tri ...

    UP

    Questions :

    1- Alors la référence (pure) dont tu parles dans l'exemple c'est un pointeur comme en C ? puisque tu dis : :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $c = & $a;  // $c est une référence (pure) de $a => $c pointe directement vers l'emplacement mémoire de $a
    Je croyais qu'il n'y avait pas de pointeur en PHP ?

    2- Que ce passe t-il très précisément au moment de l'utilisation du mot clé : "new" ?

    Si je comprend bien : new créé l'instance de class en mémoire ... et celle-ci est "lié" par référence à $a lorsqu'on utilise le symbole "=" ? (et j'en reviens à la question 1)

    3 -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $b = $a;    // $b est une référence de l'instance de classe pointée par $a et un alias de la variable $a ($a n'est pas dupliquée)
    Ça je pense que je commence à comprendre (accroches toi bien ) : tout changement de $a entraine un changement de son instance parce qu'il est 'lié' à elle par référence et donc entraine un changement de $b parce que $b est 'lié' à la même instance que $a. Mais en fait l'alias de $b (qui est $a) ne lui sert qu'a "savoir" à quelle instance ce 'lier' (se référer) au moment de son initialisation. Ce qui fait que lorsque $a est détruit $b conserve son 'lien' avec l'instance de feu $a. Est-ce que c'est ça ?

    4- Que fait très précisément la fonction clone() ? Est-ce qu'à la différence de '=' elle duplique l'instance de $a (pour reprendre le même exemple) et 'lie' cette nouvelle instance à $b sans utiliser d'alias ?


    Merci d'avance pour tes réponses, et merci pour ton super schéma

  12. #12
    Membre éprouvé
    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
    Points : 1 057
    Points
    1 057
    Par défaut
    Cet article de Julien Pauli devrait répondre à pas mal de tes questions
    http://julien-pauli.developpez.com/t...php/variables/

  13. #13
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par philodido Voir le message
    Je croyais qu'il n'y avait pas de pointeur en PHP ?
    Oui les pointeurs de PHP (au sens du C) diffèrent :
    en C tu peux faire des choses comme ça avec les pointeurs :
    unsigned **(*(*ptr)[8](char const *, ...), bon je te passe l'explication. En php, tu ne peux pas.
    PHP te décharge de tous ces aspects de la gestion mémoire, donc pointeur il y a mais très limité (c'est voulu à vrai dire).

    Pour le 2 et 3, c'est ça.

    Pour ce qui est du clonage d'objets, c'est très léger en PHP. Regardes ici.
    Il faut coder le clonage en profondeur soi-même avec la fonction magique __clone()

  14. #14
    Membre averti
    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
    Points : 342
    Points
    342
    Par défaut
    Ok, je vais étudier tout ça avec attention. Encore merci pour toutes ces infos

+ 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