web-dev-qa-db-fra.com

Comment détruire un objet?

Autant que je sache (ce qui est très peu), il y a deux façons, étant donné:

$var = new object()

Ensuite:

// Method 1: Set to null
$var = null;
// Method 2: Unset 
unset($var); 

Autre meilleure méthode? Est-ce que je coupe les cheveux ici?

107

Vous recherchez unset() .

Mais tenez compte du fait que vous ne pouvez pas détruire explicitement un objet.

Il y restera, mais si vous supprimez la valeur de l'objet et que votre script insère PHP dans les limites de la mémoire, les objets inutiles seront récupérés. J'irais avec unset() (au lieu de le mettre à null) car il semble avoir de meilleures performances (non testé mais documenté sur n des commentaires du PHP manuel officiel) .

Cela dit, n'oubliez pas que PHP détruit toujours les objets dès que la page est affichée. Cela ne devrait donc être nécessaire que sur des boucles très longues et/ou des pages intensives.

137
Frankie

Un article pratique expliquant plusieurs malentendus à ce sujet:

ne pas appeler le destructeur explicitement

Cela couvre plusieurs idées fausses sur le fonctionnement du destructeur. L'appeler explicitement ne détruira pas réellement votre variable, selon la doc PHP5:

PHP 5 introduit un concept de destructeur similaire à celui d'autres langages orientés objet, tels que C++. La méthode du destructeur sera appelée dès qu’il n’y aura pas d’autres références à un objet particulier, ou dans un ordre quelconque pendant la séquence d’arrêt.

L'article ci-dessus indique que la définition de la variable sur null peut fonctionner dans certains cas, tant que rien d'autre ne pointe vers la mémoire allouée.

8
sturrockad

Réponse courte: les deux sont nécessaires.

Je pense que la bonne réponse a été donnée mais de manière minimale. Ouais, généralement unset (()) est préférable pour la "vitesse", mais si vous voulez récupérer de la mémoire immédiatement (au prix de la CPU), utilisez plutôt null.

Comme d'autres, la valeur null ne signifie pas que tout est récupéré, vous pouvez avoir des objets en mémoire partagée (non clonés) qui empêcheront la destruction de l'objet. De plus, comme d’autres l’ont déjà dit, vous ne pouvez de toute façon pas "détruire" les objets, vous ne devez donc pas essayer de le faire.

Vous devrez déterminer lequel vous convient le mieux. Aussi, vous pouvez utiliser __destruct () pour un objet qui sera appelé non défini ou nul, mais il doit être utilisé avec précaution et, comme d’autres l’a dit, ne jamais être appelé directement!

voir:

http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/

Quelle est la différence entre assigner NULL et unset?

1
Mike Q

Ceci est une preuve simple que vous ne pouvez pas détruire un objet, vous pouvez seulement détruire un lien vers celui-ci.

$var = (object)['a'=>1];
$var2 = $var;
$var2->a = 2;
unset($var2);
echo $var->a;

résultats

2

Voir en action ici: https://eval.in/10541

0
Yevgeniy Afanasyev

Peut-être que vous créez un nouvel objet mysqli.

$MyConnection = new mysqli($hn, $un, $pw, $db);

mais même après avoir fermé l'objet

$MyConnection->close();

si vous utilisez print_r() pour vérifier le contenu de $MyConnection, vous obtiendrez une erreur comme ci-dessous:

Error:
mysqli Object

Warning: print_r(): Property access is not allowed yet in /path/to/program on line ..
( [affected_rows] => [client_info] => [client_version] =>.................)

dans ce cas, vous ne pouvez pas utiliser unlink() car unlink() nécessitera une chaîne de chemin d'accès, mais dans ce cas $MyConnection est un objet.

Donc, vous avez un autre choix pour définir sa valeur sur null:

$MyConnection = null;

maintenant, les choses se passent bien, comme vous vous y attendiez. Vous n'avez aucun contenu à l'intérieur de la variable $MyConnection ainsi que vous avez déjà nettoyé l'objet mysqli.

Il est recommandé de fermer l'objet avant de définir la valeur de votre variable sur null.

0