Que tout le monde comprenne la connaissance des références faibles de PHP

藏色散人
Libérer: 2023-04-10 06:02:01
avant
2859 Les gens l'ont consulté

Cet article va vous présenter la connaissance des références faibles en PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Dans les articles précédents, nous avons découvert les références et la référence par valeur. Nous savons qu'il n'existe pas de références pures (pointeurs) en PHP. Qu'il s'agisse d'un objet ou d'une variable affectée du symbole de référence &, il s'agit d'une référence à une table de symboles. Aujourd’hui, nous allons découvrir une autre forme de référence : la référence faible.

Que sont les références faibles

Les références faibles permettent au programmeur de conserver une référence à un objet sans empêcher la destruction de l'objet ; elles sont utiles pour implémenter des structures de type cache.

C'est une explication plus officielle. À partir de cette explication, nous pouvons voir que la référence faible est aussi une forme de référence, mais si nous détruisons l'objet d'origine, l'objet de référence faible sera également détruit, tout comme l'attribution d'un objet de valeur ordinaire. Si vous n'avez pas lu l'article précédent ou n'êtes pas familier avec les références en PHP, vous devrez peut-être en savoir plus sur les références en PHP. Ci-dessous, jetons un coup d’œil directement à travers un exemple.

WeakReference

$obj = new stdClass;
$weakref = $obj;

var_dump($weakref);
// object(stdClass)#1 (0) {
// }

unset($obj);
var_dump($weakref);
// object(stdClass)#1 (0) {
// }

$obj1 = new stdClass;
$weakref = WeakReference::create($obj1);

var_dump($weakref->get());
// object(stdClass)#2 (0) {
// }

unset($obj1);
var_dump($weakref->get());
// NULL

$weakref = WeakReference::create(new stdClass);
var_dump($weakref->get());
// NULL
Copier après la connexion

Le premier objet $obj que nous effectuons une référence d'affectation directe, qui est l'affectation d'objet par défaut de PHP. À l'heure actuelle, $weakref contient une référence à la table des symboles d'objet. Lorsque nous désactivons() $obj, $weakref peut toujours être utilisé normalement. En d'autres termes, la référence mémoire de $weakref à l'objet d'origine $obj demeure. Peu importe la manière dont nous supprimons() le $obj d'origine, cela coupe uniquement la table des symboles de référence de $obj et n'a aucun effet sur l'objet réel. Le garbage collector ne recyclera pas complètement le contenu de l'objet $obj d'origine.

Pour le deuxième objet, nous utilisons la méthode create() de WeakReference pour créer une référence faible. Lorsque nous détruisons $obj1, $weakref deviendra également NULL. C’est à ça que servent les références faibles !

Cela permet au ramasse-miettes de recycler normalement, cela peut éviter le problème de fuite de mémoire causé par les références circulaires et cela peut faire en sorte que les références se comportent comme des opérations de pointeur en C.

Le dernier morceau de code est que nous utilisons new directement dans WeakReference::create() pour créer l'objet. Ce formulaire n'est pas possible et renverra toujours NULL. Parce qu'une référence faible est créée via une variable, elle pointe vers la table de symboles de l'objet d'origine, et la connexion de la table de symboles entre la variable et l'objet est ce qui intéresse la référence faible. Elle jugera l'état actuel en fonction de l'état. de la table des symboles. Si la variable objet d'origine est coupée de la table des symboles, la variable faiblement référencée sera également coupée de manière synchrone, afin que le ramasse-miettes puisse normalement nettoyer l'objet qui n'a plus de compteur de références.

Remarque

Il convient de noter ici que le code de test ci-dessus doit être utilisé dans PHP7.4 et supérieur. La classe WeakReference est un nouvel ajout à PHP7.4. Les versions précédentes nécessitaient l'installation de l'extension WeakRef pour implémenter des fonctionnalités de référence faibles. Pour un contenu spécifique, veuillez vous référer aux documents pertinents dans le lien ci-dessous.

Code de test :

https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/%E5%AD%A6%E4%B9%A0PHP%E5%BC%B1%E5%BC%95%E7%94%A8%E7%9A%84%E7%9F%A5%E8%AF%86.php
Copier après la connexion

Apprentissage recommandé : "Tutoriel vidéo PHP"

Ce 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!

Étiquettes associées:
php
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal