S'il y a des références récursives à des objets PHP, une fuite de mémoire se produira. Ce bug existe en PHP depuis longtemps. Reproduisons d'abord ce bug. Le code est le suivant :
<?php class Foo { function __construct() { $this->bar = new Bar($this); } } class Bar { function __construct($foo) { $this->foo = $foo; } } for ($i = 0; $i < 100; $i++) { $obj = new Foo(); unset($obj); echo memory_get_usage(), " "; } ?>
Exécutez le code ci-dessus, vous constaterez que l'utilisation de la mémoire ne devrait pas changer, mais en fait. Mais elle ne cesse d’augmenter et la désactivation n’est pas pleinement efficace.
Une grande partie du développement actuel est basée sur des frameworks. Il existe des relations d'objet complexes dans l'application, vous êtes donc susceptible de rencontrer de tels problèmes. Voyons quelles solutions peuvent être mises en œuvre :
<?php class Foo { function __construct() { $this->bar = new Bar($this); } function __destruct() { unset($this->bar); } } class Bar { function __construct($foo) { $this->foo = $foo; } } for ($i = 0; $i < 100; $i++) { $obj = new Foo(); $obj->__destruct(); unset($obj); echo memory_get_usage(), " "; } ?>
Conditions de fin de récursion, il existe généralement plusieurs façons :
1 Ajoutez le paramètre de profondeur de récursion aux paramètres de la fonction récursive Profondeur de. chaque appel en ajoute un, ajoute une instruction conditionnelle dans le corps de la fonction et force un retour lorsque la profondeur dépasse une certaine valeur 2 Introduisez la structure de la pile d'éléments et du contenu qui doit être enregistré dans chacun ; la récursivité est généralement poussée dans la pile, apparaît le cas échéant Dans le corps de la fonction, ajoutez des instructions conditionnelles pour déterminer la taille de la pile ou les éléments de la pile, et revenez lorsque les conditions sont rempliesCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!