Rechercher

Tip #8 Objets - Références VS Pointeurs

Les objets sont des références. Cela signifie que si vous affectez un objet à une variable et que vous affectez ensuite cette variable à une autre variable, les 2 variables partageront la même référence à l'objet créé.

Regardez ce code :

Nous pouvons voir, dans cet exemple, que quand nous modifions $object2, cela modifie aussi $object1.

Voici une petite animation qui démontre comment fonctionne l'allocation de la mémoire :

Maintenant, vous pouvez dire : "Oui, c'est comme un pointeur", où je répondrais : "Pas vraiment". La différence réside dans le fait que les références sont comptées, c'est-à-dire que chaque fois qu'un objet est référencé, dans une variable ou dans un attribut d'un objet, le nombre de références est incrémenté. L'objet en mémoire est détruit lorsque le compteur de référence atteint 0, il n'y a plus de référence à cet objet et il n'y a donc plus de raison de le garder en mémoire.


Quand vous utilisez des pointeurs, il n'y a pas de comptage de référence, ce qui signifie que si la variable sur laquelle vous essayez de pointer n'existe plus, le pointeur retourne Null.

Quelqu'un, lors du World Tour 2019 en Suisse, a demandé "Que se passe-t-il si j'ai un pointeur sur un objet ? Cet objet est-il compté ?". La réponse courte est "Non".

Mais regardons un exemple :

Method zz_test

Method zz_test2

Ici, dans la première méthode, nous créons un nouvel objet que nous affectons à la variable $ob1. Nous passons ensuite cette référence à la méthode zz_test2. Dans zz_test2 on obtient la référence à l'objet assigné à $ob1. Nous l'assignons à une variable locale aussi appelée $obj1. Nous créons ensuite 2 nouveaux objets que nous assignons à $ob2 et $ob3. Nous assignons ensuite ces 2 variables à 2 nouveaux attributs de $ob1. On crée d'abord un attribut ob2 et on assigne un pointeur à $ob2, puis on crée un autre attribut ob3 et on lui assigne une référence à l'objet assigné à $ob3.

Restons dans la méthode zz_test2 et regardons l'état ref count à ce point du code :

  • Object_1 : ref count = 2 --> $ob1 dans zz_test et $ob1 dans zz_test2

  • Object_2 : ref count = 1 --> $ob2 dans zz_test2

  • Object_3 : ref count = 2 --> $ob3 dans zz_test2 et (Object 1).ob3

Quand nous quitterons la méthode zz_test2, l'état ref count sera :

  • Object_1 : ref count = 1 --> $ob1 dans zz_test

  • Object_2 : ref count = 0

  • Object_3 : ref count = 1 --> (Object 1).ob3

Object_2 sera détruit alors qu'Object_1 et Object_3 seront toujours référencés et donc gardés en mémoire. Quel sera donc l'état de $ob1.ob2 ? Il pointera vers une variable locale d'une autre méthode qui n'existe plus et retournera Null.

Etat de $ob1 dans le débogueur de la méthode zz_test2

Etat de $ob1 dans le débogueur de la méthode zz_test

Encore une fois une petite animation qui montre comment fonctionne l'allocation de la mémoire :


15 vues

Posts récents

Voir tout

Me contacter

  • Twitter
  • YouTube

Biel/Bienne - Bern - Switzerland