[RESOLU] POO affectation entre d'objet

jcpans
Invité n'ayant pas de compte PHPfrance

27 mai 2010, 11:31

Bonjour

je debute en POO, j'aimerai que quelqu'un corrige mes connaissances si celle-ci sont erronées.
-
-Si on affecte à un objet2 un autre objet1, puis on modifie les propriété de l'objet1 les propriétés de l'objet2 seront modifié en conséquence mais si on détruit l'object2 l'object1 reste intact et versi versa.

Code : Tout sélectionner

class SimpleClass { // déclaration des propriétés public $var = 'a default value'; // déclaration des méthodes public function displayVar() { echo $this->var; } } $instance = new SimpleClass(); $assigned = $instance; $reference = $instance; $instance->var = '$assigned aura cette valeur'; $reference = null; // $instance et $reference deviennent null echo '<pre>'; var_dump($instance); echo '</pre>'; echo '<pre>'; var_dump($reference); echo '</pre>'; echo '<pre>'; var_dump($assigned); echo '</pre>';
exact ?

Merci d'avance

ViPHP
ViPHP | 2287 Messages

27 mai 2010, 18:26

Bonjour,

PHP5.x a introduit une gestion "intelligente" des affectations. Ainsi, affecter un objet à une variable assigne en fait à la variable une référence vers cet objet.

Tu as donc les trois variables qui pointent vers le même objet (ce qui explique que quand tu modifies une propriété, ça se répercute aussi dans les propriétés des autres variables : il s'agit bien du même objet dans les trois, qui a été modifié).

Par contre la "destruction" d'un objet ne se fait pas en affectant un null mais avec unset().

L'affectation d'un null à ta variable, étant donné que null n'est pas un objet, se fait normalement. La référence vers l'objet contenue auparavant dans la variable est perdue, mais il reste deux références vers ce même objet, respectivement dans les deux autres variables.

C'est pourquoi tu as dû obtenir ce résultat en lançant ton test :

Code : Tout sélectionner

object(SimpleClass)#1 (1) { ["var"]=> string(27) "$assigned aura cette valeur" } NULL object(SimpleClass)#1 (1) { ["var"]=> string(27) "$assigned aura cette valeur" }
if(!@work()){ Nespresso(); } else { what(); }
______________________________