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 :

Clone dans une boucle [PHP 5.0]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 37
    Points : 30
    Points
    30
    Par défaut Clone dans une boucle
    Bonjour !
    J'ai un chti souci avec un clone placé dans une boucle
    J'aimerais dans chaque tour de boucle, cloner un objet, initialiser ses attributs avec des valeurs et le pusher dans tableau
    Or, à la sortie de la fonction mon tableau est initialiser avec la même instance dans toute ses cases ...

    Voici mon bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    			if($stmt->execute()){
    				foreach($stmt->fetchall(PDO::FETCH_ASSOC) as $rowRes){
    					$oTemp = clone $this;
    					$oTemp->raz();
     
    					foreach($oTemp->column as $key => $column)
    						$column->setNull(true);
     
    					foreach($rowRes as $key => $rowValue)
    						$oTemp->column[$key]->setValue($rowValue);
     
    					$aReturn[] = $oTemp;
    				}
    			}
    J'ai ensuite pensé que ça venait du fait que j'utilisais une même var ($oTemp)
    J'ai changé mon code pour tester autre chose :
    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
    			if($stmt->execute()){
    				$nI = 0;
     
    				foreach($stmt->fetchall(PDO::FETCH_ASSOC) as $rowRes){
    					$aReturn[$nI] = clone $this;
    					$aReturn[$nI]->raz();
     
    					foreach($aReturn[$nI]->column as $key => $column)
    						$column->setNull(true);
     
    					foreach($rowRes as $key => $rowValue)
    						$aReturn[$nI]->column[$key]->setValue($rowValue);
     
    					$nI++;
    				}
    			}
    Mais le résultat est le même ...
    Je viens à vous pour trouver une solution !
    Des clones vi mais pô si ... cloné XD

    Merchi d'avance !

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    salut,

    peux tu nous indiquer comment tu fais pour déterminer si les variables du tableau sont clonées ou non.

    bye

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    Bonjour Kaymak et merchi de porter un intérêt pour mon souci
    Pour vérifier ce qui cloche dans le clonage je fais un var_dump() de mon tableau $aReturn à la sortie du if et les instances sont toutes les mêmes dedans ...

    Si ça peut aider, si je fais un var_dump($aReturn[$nI]); pendant la boucle, le clone est bon (attribut de l'objet bien initialisé)

    J'ai réécris mon code pour plus de clarté :
    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
    if($stmt->execute()){
    	$nI = 0;
     
    	foreach($stmt->fetchall(PDO::FETCH_ASSOC) as $rowRes){
    		$aReturn[$nI] = clone $this;
    		$aReturn[$nI]->raz();
     
    		foreach($aReturn[$nI]->column as $key => $column){
    			$column->setNull(true);
    			$column->setValue($rowRes[$key]);
    		}
     
    		$nI++;
    	}
    }

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Salut,

    pas de souci. Pour l'exemple, le plus top, aurait été d'avoir un exemple fonctionnel que je puisse tester.
    Mais bon ce n'est pas grave, je pense avoir saisit le souci ! Du moins j'espère.

    En faits, si j'ai bien compris ton code, $this, est une instance d'un objet utilisé pour faire ton mapping bd->objet.
    Pour plus de simplicité j'appellerais ces objets des DBMap.

    Bref, la classe DBMap expose des colonnes , comme dans ta base, pour attribuer, récupérer les valeurs par colonne.
    Et c'est là que le problème apparaît je pense.
    En effet lorsque tu clones ton objet, ce n'est pas un attribut de type primitif (int, float, string ect) qui est dupliqué, ce sont des objets colonnes.
    Hors, les objets colonnes par défaut, ne sont pas clonés lorsque tu clones, ils sont référencés !
    Et comme ils sont référencés, modifiés la valeur de la première colonne de l'instance initiale, ou de la dernière, modifie tous les autres clones !!

    Donc, si j'ai visé juste. Il te suffit de ré implémenter __clone dans DPMap pour cloner les colonnes !! Et non laisser faire PHP qui réalisera un référencement par défaut.

    Qu'en penses tu ?

    En tout cas voici un exemple, fonctionnel, et démonstratif du problème que je pressens :
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    <?
    /*
    ** Exemple 1, sans clone, utilisation des références par défaut
    */
    class A{
    	public $c;
    	public $b_obj;
    }
    class B{
    	public $f;
    }
     
    $B = new B();
    $B->f = "pwet pwet";
     
     
    $t = new A();
    $t->c = "une valeur initiale";
    $t->b_obj = $B;
     
    $t_ref = clone($t);
     
     
     
    $t->b_obj->f = "pwet pwet je suis différent partout car je suis référencé !!";
     
    echo "<pre>";
    var_dump($t);
    var_dump($t_ref);
    echo "</pre>";
     
     
     
    /*
    ** Exemple 2, avec clone, ipmplémentation individuel de __clone pour A qui permet de bien déréférencer les objets internes.
    */
    class A_clone{
    	public $c;
    	public $b_obj;
     
    	public function __clone(){
    		$this->b_obj = clone($this->b_obj );
    	}
    }
     
    $Bb = new B();
    $Bb->f = "pwet pwet";
     
     
    $Tt = new A_clone();
    $Tt->c = "une valeur initiale";
    $Tt->b_obj = $Bb;
     
    $Tt_ref = clone($Tt);
     
     
     
    $Tt->b_obj->f = "pwet pwet je NE suis PAS différent partout car je NE suis PAS référencé !!";
     
    echo "<pre>";
    var_dump($Tt);
    var_dump($Tt_ref);
    echo "</pre>";
     
     
     
     
     
     
    ?>


    a plus

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    En effet Kaymak c'est tout à fait ce que je fais
    Bravo pour avoir tout compris avec ce chti bout de code et merchi beaucoup pour l'explication, ça me tracasse depuis 2 jours lol
    Bref si je clone plutôt que de faire un new c'est que j'ai un appel à la BDD dans mon constructeur donc imagine si j'ai 3K enregistrement ... De plus je cherche à avoir le comportement du clonage donc bon XD

    Ton exemple sort bien le même comportement que j'ai
    Good ça explique le pourquoi

    Je vais surchager __clone et je te tiens au courant !

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Citation Envoyé par Fluckysan Voir le message
    ..Bref si je clone plutôt que de faire un new c'est que j'ai un appel à la BDD dans mon constructeur donc imagine si j'ai 3K enregistrement ..
    Ah oui ! ca c'est bad :/ Très très mauvais en fait, selon moi.

    Mais bon ce n'est que mon avis, et il est peu suivit, alors je me le garde

    J'espère que tu résoudra ton pb

    a plus

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 37
    Points : 30
    Points
    30
    Par défaut
    Oki ça résout mon prob
    Par contre je suis intéressé par ton avis si tu veux on peut continuer cette discution par MP

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

Discussions similaires

  1. [langage] incrementation de variable dans une boucle
    Par mimilou dans le forum Langage
    Réponses: 15
    Dernier message: 16/04/2004, 13h23
  2. Problème avec TNMSMTP dans une boucle.
    Par Orgied dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/04/2004, 10h19
  3. swf dans une boucle asp
    Par Chucky69 dans le forum Flash
    Réponses: 11
    Dernier message: 10/02/2004, 17h07
  4. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 14h37
  5. Pause dans une boucle
    Par HT dans le forum Langage
    Réponses: 4
    Dernier message: 03/06/2003, 08h52

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