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