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 :

Clonage d'objet : compréhension [Débutant(e)]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2003
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 3
    Points : 5
    Points
    5
    Par défaut Clonage d'objet : compréhension
    Bonjour,

    J'ai voulu utiliser la fonction "clone" pour faire un "snapshot" de l'état d'un objet à un instant 't'.

    Je me suis alors apperçu que les objets "clonés" continuent, après leur création, d'évoluer de manière analogue à l'objet avec lequel ils ont été clonés alors que je souhaitais les voir évoluer indépendamment.

    Aussi, j'ai un problème de compréhension dans l'exemple ci-dessous dans la mesure où tous les objets ne sont "actifs" qu'après l'appel de la méthode "clone" alors qu'ils ont été créés avant (précédente itérration dans ma boucle). Je m'attendais donc à pouvoir faire appel à eux avant.

    Mon code exemple :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
    class MyObj {
      var $int_VarTest=0; # variable incrémentale
      var $int_TempValue; # valeur en mémoire pour l'objet
     
      function TestClone_MyObj()
      {
        if($this->int_VarTest >= 2)
    	{
    	  exit(); # permet de sortir de la boucle
    	}
     
        $this->int_VarTest++;
        # Test d'existance des objets
        for ($i=1;$i<=$this->int_VarTest;$i++)
        {
        echo 'AVANT retour de is object() pour objet : ' . 'toto' . $i . ' = ' . is_object(${'toto' . $this->int_VarTest}) . '<br>';
        //echo 'APRES obj toto' . $i . ', $int_TempValue = ' . ${'toto' . $this->int_VarTest}->int_TempValue . '<hr>'; // Ne retourne rien dans cet exemple
        }
     
        ${'toto' . $this->int_VarTest} = clone $this; # clonage de l'objet précédent avec un nom incrémenté
        ${'toto' . $this->int_VarTest}->int_TempValue = $this->int_VarTest; # affectation d'une nouvelle valeur (incrémentée)
     
        # Test d'existance des objets
        for ($i=1;$i<=$this->int_VarTest;$i++)
        {
        echo 'APRES retour de is object() pour objet : ' . 'toto' . $i . ' = ' . is_object(${'toto' . $this->int_VarTest}) . '<br>';
        echo 'APRES obj toto' . $i . ', $int_TempValue = ' . ${'toto' . $this->int_VarTest}->int_TempValue . '<hr>';	  
        }
     
        ${'toto' . $this->int_VarTest}->TestClone_MyObj(); # Appel récurcif
      }
    }
     
    $MyObj1 = new MyObj();
    $MyObj1->TestClone_MyObj();
    ?>
    Le résultat d'execution de ce code donne :

    Notice: Undefined variable: toto1 in C:\Program Files (x86)\EasyPHP-5.3.8.1\www\(...).php on line 17
    AVANT retour de is object() pour objet : toto1 =
    APRES retour de is object() pour objet : toto1 = 1
    APRES obj toto1, $int_TempValue = 1

    Notice: Undefined variable: toto2 in C:\Program Files (x86)\EasyPHP-5.3.8.1\www\(...).php on line 17
    AVANT retour de is object() pour objet : toto1 =
    Notice: Undefined variable: toto2 in C:\Program Files (x86)\EasyPHP-5.3.8.1\www\(...).php on line 17
    AVANT retour de is object() pour objet : toto2 =
    APRES retour de is object() pour objet : toto1 = 1

    APRES obj toto1, $int_TempValue = 2
    APRES retour de is object() pour objet : toto2 = 1
    APRES obj toto2, $int_TempValue = 2
    Mes questions :
    - Est-il possible dans mon cas de rendre chaque objet toto1, toto2, etc indépendant? C'est à dire que le premier aura la valeur $int_TempValue = 1, le second $int_TempValue = 2, etc?
    - Pourquoi dans les tests des cas "AVANT" l'appel à la méthode clone, aucun des objets n'existent alors qu'après l'appel, le nouveau (incrémentation) et tous ceux créés précedemment existent alors? J'aurais aimé pouvoir appeller les objets précédemment créés à l'itération précédentes avant un nouvel appel à la méthode clone. Pouvez-vous m'indiquer ce qui ne va pas dans ma façon de faire?

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ton test m'a l'air un peu farfelu... on ne comprends pas bien ce que tu essaie de tester.

    On va faire plus simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $obj = (object)array('a'=>1);
     
    var_dump("Objet", $obj);
     
    for ($i=0; $i<3; $i++) {
    	${"handle_$i"} = clone $obj;
    	${"handle_$i"}->a *= $i;
    	var_dump("Nouveau clône", ${"handle_$i"});
    }
     
    var_dump("Objet", $obj);
    Produit:
    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
    string 'Objet' (length=5)
    object(stdClass)[1]
      public 'a' => int 1
    string 'Nouveau clône' (length=14)
    object(stdClass)[2]
      public 'a' => int 0
    string 'Nouveau clône' (length=14)
    object(stdClass)[3]
      public 'a' => int 1
    string 'Nouveau clône' (length=14)
    object(stdClass)[4]
      public 'a' => int 2
    string 'Objet' (length=5)
    object(stdClass)[1]
      public 'a' => int 1
    Qu'est ce qu'on remarque ? Chaque instance clonée est effectivement indépendante de l'objet initial (la preuve: on a changé une propriété et celle de l'objet initial n'a pas bougé - on le remarque également avec son identifant object(stdClass)[4] qui change à chaque fois).

    Je crois que tes question découlent du mécanisme de ta méthode et non du principe de clonage d'objet.

    Ensuite, clone n'est pas à proprement parler une fonction mais un mot clé du langage.

Discussions similaires

  1. Problème de clonage d'objet !
    Par engies dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 21/11/2010, 20h15
  2. Clonage d' objets
    Par TheDoci dans le forum Général Java
    Réponses: 0
    Dernier message: 20/02/2010, 16h56
  3. [POO] Clonage d'objet ou pas ?
    Par grunk dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2008, 23h42
  4. [Memento] Design Pattern Memento ou clonage d'objets ?
    Par SPQR dans le forum Design Patterns
    Réponses: 1
    Dernier message: 23/07/2007, 09h08
  5. Clonage d'un objet
    Par Dar Shak dans le forum Java ME
    Réponses: 2
    Dernier message: 31/05/2005, 17h06

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