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 :

je ne comprend pas comment fonctionne "qu'on set une class"


Sujet :

Langage PHP

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut je ne comprend pas comment fonctionne "qu'on set une class"
    Bonjour, j'essaye de faire discuter 2 objet, dans cette exemple je ne comprend pas ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $unO2->setO1($unO1)
    d'habitue on fait un "setter" sur un attributmiseajout->setpseudo='nouveau pseudo') or ici c'est sur une class (class 01)

    qu'est ce qu'on fait ici? on met a jour l'attribut à l'aide du constructeur
    j'ai essayer de faire des var_dump pour voir ce qui se passe:
    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
     
    <?php
    $unO2 = new O2();
    echo "<h3>dump un02</h3>";
    var_dump($unO2);
    echo "<br/>";
    $unO1 = new O1($unO2);
    echo "<h3>dump un01</h3>";
    var_dump($unO1);
    echo "<br/>";
    $unO2->setO1($unO1);
    echo "<h3>dump un02</h3>";
    var_dump($unO1);
    ?>
     
    <?php
    class O1 
            {
            private $lienO2;
     
            public function __construct(O2 $unO2) 
            { // notez le typage de l’argument du constructeur
            echo "je commence la class2<br/>";
                    $this->lienO2 = $unO2;
                    var_dump($unO2);
                    echo '<br/>';
     
     
            }
     
            public function jeTravaillePourO1() 
            {
                    print("je travaille pour O1 <br> \n");
                    $this->lienO2->jeTravaillePourO2(); // envoi de message vers la classe O2
            }
     
            public function jeTravailleAussiPourO1() 
            {
                    print("je travaille aussi pour O1 <br> \n");
            }
     
    }
    ?>
    donc il affiche comme résultat:
    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
     
    je precharge 02 la class2
    dump un02
    object(O2)#1 (1) { ["lienO1":"O2":private]=> NULL }
    je commence la class2
    object(O2)#1 (1) { ["lienO1":"O2":private]=> NULL }
    dump un01
    object(O1)#2 (1) { ["lienO2":"O1":private]=> object(O2)#1 (1) { ["lienO1":"O2":private]=> NULL } }
    dump un02
    object(O1)#2 (1) 
    {
             ["lienO2":"O1":private]=>  object(O2)#1 (1) 
                     { ["lienO1":"O2":private]=>  object(O1)#2 (1) 
                             { ["lienO2":"O1":private]=>  object(O2)#1 (1) 
                                     { 
                                             ["lienO1":"O2":private]=>  *RECURSION* 
                                     } 
                     }
             } 
    }
    comment peut t'on expliquer simplement ce qui se passe?

    ************************************************
    voici le code original

    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
     
     
    <?php
    class O1 
            {
            private $lienO2;
     
            public function __construct(O2 $unO2) 
            { // notez le typage de l’argument du constructeur
                    $this->lienO2 = $unO2;
            }
     
            public function jeTravaillePourO1() 
            {
                    print("je travaille pour O1 <br> \n");
                    $this->lienO2->jeTravaillePourO2(); // envoi de message vers la classe O2
            }
     
            public function jeTravailleAussiPourO1() 
            {
                    print("je travaille aussi pour O1 <br> \n");
            }
     
    }
    $unO2 = new O2();//ne fait rien pour le moment
    $unO1 = new O1($unO2);//avec le constructeur attribut $lient02=l'instance de la class 02
    $unO2->setO1($unO1);//met a jour l'instance de la classe 02
    $unO1->jeTravaillePourO1();//ici démarrage je travail pour 02
    $unO2->jeTravaillePourO2();
    ?>
     
     
    <?php
    class O2 
    {
            private $lienO1;
            public function jeTravaillePourO2() 
            {
                    print ("je travaille pour O2 ***<br> \n");
                    $this->lienO1->jetravailleAussiPourO1(); // envoi de message vers la classe O1
            }
     
            public function setO1(O1 $unO1) 
            { // la méthode réalise l’association avec la première classe
            $this->lienO1 = $unO1;
            }
    }
    ?>
    merci de vos réponses

  2. #2
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    comment peut t'on expliquer simplement ce qui se passe?
    Les objets $unO1 et $unO2 ont des références l'un vers l'autres.
    Le var_dump() va afficher *RECURSION* parce qu'on est dans un cas de références cyclomatiques (les objets se référencent mutuellement).
    Il n'y a rien de spécial. C'est très fréquent en OOP.

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    merci de ta réponse metagoto
    j'ai pas assez regarder il y a bien une methode set dans 02 j'ai mal lu
    (je pensait qu'en faisant set 01 ca venait tous seul dans déclarer un methode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public function setO0(01 $unO0)
    maintenant je souhaite m'inspirer de cette situation:

    j'essaye de crée 2 Class
    -la class Requete, elle a 2 methode (requete 1 et requete 2)
    -la class execute elle a cette fameuse setrequete(mais en fait pourquoi on fait un set de cette class? si on la fait pas que se passe t'il? les 2 class ne peuvent s'échanger les "donnee")

    j'aimerais que l'on fasse la première requete, si elle n'est pas satisfaite la class execute demande de faire une deuxiième requete:
    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
     
    <?php
    class Requete
    {
    	private $link_exe;
     
    	function __construct(Execute $ordre)
    	{
    		$this->link_exe=$ordre;
    	}
     
    	public function Req1()
    	{
    		$sql="SELECT * FROM TABLE WHERE nom='a' ";
    	}
     
    	public function Req2()
    	{
    		$sql="SELECT * FROM TABLE WHERE REGEXP 1 ";
    	}
     
    }
     
    class Requete
    {
    	private $link_exe;
    	private $statisfait;
    	function __construct(Execute $ordre)
    	{
    		$this->link_exe=$ordre;
    	}
     
    	public function Req1()
    	{
    		echo $sql="SELECT * FROM TABLE WHERE nom= 'a' " ;
    		si elle ne donne pas de résultat = nom
    		si elle donne un resutat affichage des reponses
    	}
     
    	public function Req2()
    	{
    		echo $sql="SELECT * FROM TABLE WHERE REGEXP 1 ";
    		si elle ne donne pas de resultat on dit pas de donne
    		si elle donne un resultat on affiche des reponses
    	}
     
    }
     
     
    class Execute
    {
    	private $link_Req;
     
    	public function setRequete(Requete $execute)
    	{
    		$this->$link_exe=$execute;
    	}
    }
    ?>
     
    <?php
    $ordre=new Execute();
    $execute=new Requete($ordre);
    $ordre->setRequete($execute);
    ?>
    la je n'arrive pas aller plus loin j'ai cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Notice: Undefined variable: link_exe in /var/www/AA/cyclo.php on line 30 Fatal error: Cannot access empty property in /var/www/AA/cyclo.php on line 30

  4. #4
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->$link_exe=$execute;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->link_Req=$execute;
    edit: j'ai mis link_Req au lieu de link_exe

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    il fallait changer les 2 $this?
    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
     
    <?php
    class Requete
    {
    	private $link_Req;
     
    	function __construct(Execute $ordre)
    	{
    		$this->link_exe=$ordre;
    	}
     
    	public function Req1()
    	{
    		$sql="SELECT * FROM TABLE WHERE nom='a' ";
    	}
     
    	public function Req2()
    	{
    		$sql="SELECT * FROM TABLE WHERE REGEXP 1 ";
    	}
     
    }
     
     
     
    class Execute
    {
    	private $link_Exe;
     
    	public function setRequete(Requete $execute)
    	{
    		$this->$link_Req=$execute;
    	}
    }
    ?>
     
    <?php
    $ordre=new Execute();
    $execute=new Requete($ordre);
    $ordre->setRequete($execute);
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Notice: Undefined variable: link_Req in /var/www/AA/cyclo.php on line 32 Fatal error: Cannot access empty property in /var/www/AA/cyclo.php on line 32

  6. #6
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Non
    Il y a plusieurs erreurs maintenant.

    La premiere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $this->$link_Req=$execute; // pas bon
    $this->link_Req=$execute; //OK
    Ensuite, il y a des problemes de properties:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Execute
    {
    	private $link_Exe; // mettre $link_Req à la place
     
    	public function setRequete(Requete $execute)
    	{
    		$this->link_Req=$execute; // link_Req
    	}
    }
    Meme chose pour la classe Requete

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    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
     
    <?php
    class Requete
    {
    	private $link_Exe;
     
    	function __construct(Execute $ordre)
    	{
    		$this->link_Exe=$ordre;
    	}
     
    	public function Req1()
    	{
    		$sql="SELECT * FROM TABLE WHERE nom='a' ";
    	}
     
    	public function Req2()
    	{
    		$sql="SELECT * FROM TABLE WHERE REGEXP 1 ";
    	}
     
    }
     
     
     
    class Execute
    {
    	private $link_Req;
     
    	public function setRequete(Requete $execute)
    	{
    		$this->$link_Req=$execute;
    	}
    }
    ?>
     
    <?php
    $ordre=new Execute();
    $execute=new Requete($ordre);
    $ordre->setRequete($execute);
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Notice: Undefined variable: link_Req in /var/www/AA/cyclo.php on line 32 Fatal error: Cannot access empty property in /var/www/AA/cyclo.php on line 32
    il y a pas une astuce pour écrire correctement cela, sa se mors la queue

  8. #8
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Je l'ai déjà dit 2 fois:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $this->$link_Req=$execute; // pas bon
    $this->link_Req=$execute; // ok
    corrige ton code

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    merci a toi j'ai mis en $en trop avec $this pas de $ sur l'attribut
    je vais testé tous ca merci maintenant j'ai une page blanche
    j'espère y arriver a mettre mes condition et mes requetes

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/09/2007, 09h49
  2. [MySQL] cron ne comprend pas comment faire
    Par schats dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 26/06/2007, 16h42
  3. Réponses: 3
    Dernier message: 13/06/2007, 17h47
  4. stencil buffer : comprend pas son fonctionnement
    Par casafa dans le forum OpenGL
    Réponses: 8
    Dernier message: 28/04/2007, 08h53
  5. [MySQL] Php, je ne comprends pas comment faire pour introduire des données dans une table
    Par Liondd dans le forum PHP & Base de données
    Réponses: 23
    Dernier message: 14/12/2006, 12h53

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