J'ai mentionné auparavant que la référence (REFERENCE) était un indicateur en PHP5, et après PHP7, nous l'avons transformé en un nouveau type : IS_REFERNCE. Cependant, la référence est une application très courante, donc ce changement a apporté beaucoup de changements, et a également provoqué de nombreux bugs lors du développement de PHP7 car nous avons parfois négligé de gérer ce type.
Le cas le plus simple est celui de gérer différents types désormais. pour considérer davantage ce nouveau type. Par exemple, en PHP7, cette forme de code est devenue très courante :
try_again: swtich (Z_TYPE_P(zv)) { case IS_TRING: break; case IS_ARRAY: break; ... case IS_REFERENCE: zv = Z_REFVAL_P(zv); //解引用 goto try_again; break; }
Si vous écrivez vos propres extensions et oubliez de considérer ce nouveau type, cela posera des problèmes.
Pourquoi ?
Donc, puisque ce nouveau type, les types posent tant de problèmes, pourquoi avons-nous changé la référence en type ? Pourquoi ne pas simplement utiliser un indicateur ?<🎜 ? >
En un mot, nous devons faire cela. - _#Comme mentionné précédemment, Hashtable stocke directement zval, donc dans la table des symboles, comment deux zval peuvent-ils partager une valeur pour des types complexes tels ? comme chaînes, il semble que nous puissions utiliser zend_refcounted. Un bit d'indicateur est ajouté à la structure pour indiquer qu'il est résolu par référence. Cependant, cela rencontrera également une copie provoquée par Change On Write, mais nous savons qu'en PHP7, certains types le sont. directement stocké dans zval, comme IS_LONG, mais les types de référence Le comptage de références est requis, alors comment représenter un zval qui est IS_LONG et IS_REFERNCE ?Pour cette raison, nous avons créé ce nouveau type :Comme le montre la figure, reference est un nouveau type : zend_reference pour zval de type IS_REFERNCE, zval.value.ref est un pointeur vers zend_reference, qui contient un nombre de références et un zval, le zval spécifique La valeur est stockée dans zval.value.ref->val Donc pour la référence de IS_LONG, utilisez un zval de type IS_REFERNCE, qui pointe vers un zend_reference, et ce zend_reference-> val est un zval de type IS_LONG.Change On Write
PHP utilise le comptage de références pour effectuer un garbage collection simple :<?php 1. $val = "laruence"; 2. $ref = &$val; 3. $copy = $val; ?>
$ php-7.0/sapi/cli/php /tmp/1.php Used 0.00021380008539 Used 0.00020173048281
Recommandé : "
Tutoriel PHPCe 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!