2010-05-12 3 views
0

J'ai un problème de référence; l'exemple doit être plus descriptif que moi: PProblème de référence lors du retour d'un objet à partir d'un tableau dans PHP

J'ai une classe qui a un tableau d'objets et de les récupérer par une clé (chaîne), comme un tableau associatif:

class Collection { 

    public $elements; 

    function __construct() { 
     $this->elements = array(); 
    } 

    public function get_element($key) { 

     foreach($this->elements as $element) { 
      if ($element->key == $key) { 

       return $element; 
       break; 
      } 
     } 
     return null; 

    } 

    public function add_element ($element) { 
     $this->elements[] = $element; 
    } 

} 

Puis-je avoir un objet (générique), avec une clé et certaines variables:

class Element { 

    public $key; 
    public $another_var; 

    public function __construct($key) { 
     $this->key = $key; 
     $this->another_var = "default"; 
    } 
} 

maintenant, je crée ma collection:

$collection = new Collection(); 

$collection->add_element(new Element("test1")); 
$collection->add_element(new Element("test2")); 

Et puis j'essaie de changer la variable d'un élément contenu dans mon « tableau »:

$element = $collection->get_element("test1"); 
$element->another_var = "random_string"; 
echo $collection->get_element("test1")->another_var; 

Ok, la sortie est

random_string 

donc je sais que mon objet est passé à l'élément $ en référence mode.

Mais si je fais, à la place:

$element = $collection->get_element("test1"); 
$element = null; //or $element = new GenericObject(); 
$element->another_var = "bla"; 
echo $collection->get_element("test1")->another_var; 

la sortie est

default 

comme si elle a perdu la référence.

Alors, qu'est-ce qui ne va pas? J'ai les références aux variables de l'élément et non à l'élément lui-même?

Des idées? Edit: Pour clarifier, je veux "changer" l'élément objet avec un autre, mais en gardant la position dans le tableau.

Maintenant, je comprends ce n'est pas possible de cette façon :(

+0

pourquoi vous essayez d'accéder à une référence null? Quel genre de résultat vous attendriez-vous? – Simon

Répondre

1

Vous modifiez la variable another_var sur un élément pointant sur null. Cela signifie que vous ne modifiez pas du tout l'élément de collection. C'est pourquoi vous obtenez la valeur "default" ...

Même si vous travaillez avec des références, les références elles-mêmes sont transmises par valeur. Cela devrait le rendre plus clair:

$a = new Object(); 
$b = $a; 
$a = null; 

$b est encore new Object() dans ce cas.

Edit:

Si vous souhaitez modifier l'objet à cette position, vous devez accéder à votre collection (peut-être un tableau associatif) et changer l'objet à cette position. Vous pouvez le faire en fournissant un set_element ($ key, $ value).

<? 

class Collection 
{ 
    private $elements; 

    public set_element($key, $value) 
    { 
    $elements[$key] = $value; 
    } 

    public get_element($key) 
    { 
    return $elements[$key]; 
    } 
} 

?> 
1

$element a la référence à l'objet, qui est bon, mais si vous le faites

$element = null; //or $element = new GenericObject(); 

vous assignez une nouvelle valeur à $element et vous perdez la référence à l'objet précédent

Si je le fais.

$element = new A(); 

puis

$element = new B(); 
$element->foo(); 

-je accéder à la méthode foo d'un objet de la classe B et non A comme une nouvelle valeur a été affectée à $element.

1

Vous avez récupéré une référence et l'avez affectée à la variable $element. Ensuite, vous avez changé la variable pour faire référence à un nouvel objet au lieu de manipuler l'ancien objet.

0

Lorsque vous faites ceci:

$element = null; 
$element->another_var = "bla"; 

vous définissez la valeur de another_var à un objet nul, parce que $ élément est null. Si vous essayez cette

$element->another_var = "bla";  
$element = null; 

alors il devrait fonctionner

Questions connexes