Maison  >  Article  >  développement back-end  >  Mécanisme de copie sur écriture de variables PHP

Mécanisme de copie sur écriture de variables PHP

不言
不言original
2018-04-14 13:44:411421parcourir

Cet article présente principalement le mécanisme de copie sur écriture utilisant des variables PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer

Réimprimé du blog de LYC<.>

Bien que les idées de programmation puissent être partagées, les différences entre les langages sont encore relativement évidentes, mais les utilisateurs n'en sont pas conscients. Comprendre les différences est toujours une bonne chose pour écrire des programmes et contrôler les performances. Introduisons la copie en écriture, un mécanisme très important de PHP. Introduisons d'abord ce mécanisme en utilisant les variables les plus simples. Avant d'en parler, l'auteur présente d'abord comment les types faibles sont implémentés.

Tout le monde sait que PHP est implémenté en C, mais C est un langage fortement typé. Comment PHP peut-il devenir un langage faiblement typé. Jetons un coup d'œil au code des variables PHP dans la couche inférieure du langage C

typedef struct _zval_struct zval;
typedef unsigned int zend_uint;
ypedef unsigned char zend_uchar;
struct _zval_struct {
    zvalue_value value;      /*注意这里,这个里面存的才是变量的值*/
    zend_uint refcount__gc;  /*引用计数*/
    zend_uchar type;        /* 变量当前的数据类型 */
    zend_uchar is_ref__gc;   /*变量是否引用*/};typedef union _zvalue_value {    long lval;      /*PHP中整型的值*/
    double dval;    /*PHP的浮点数值*/
    struct {     
        char *val;        int len;
    } str;               /*PHP的字符串*/
    HashTable *ht;     /*数组*/
    zend_object_value obj;  /*对象*/} zvalue_value;
J'ai ajouté quelques commentaires. Vous pouvez constater qu'en fait, les variables de bas niveau que nous utilisons en PHP sont. une structure zval. La structure zvalue_value à l'intérieur est en fait une union. Cette union stocke en fait les valeurs variables de PHP. Ci-dessous, nous utilisons des exemples de code PHP réels pour représenter l'ensemble du processus de travail. Regardons d'abord le langage C. La première est la partie non-fonctionnelle. Parlons de la partie fonctionnelle dans le chapitre suivant. Cliquez sur

int i = 4;  //alloca方式在内存中分配空间,这个变量在内存中的栈区
int j = i;   //alloca方式在内存中分配空间,并且将原先内存空间里面的数据复制到新的内存空间中,这个变量在内存的栈区
int j = 5;  //不分配内存空间,对变量j所在的栈区空间的数据进行修改

L'espace mémoire ouvert par toutes les variables PHP est. dans le tas, qu'il s'agisse d'une variable temporaire ou d'une variable globale, mais les variables temporaires de PHP sont enregistrées dans la table active_symbal_table et dans l'enregistrement de la variable globale. Pourquoi PHP est-il plus lent que C dans la table symbal_table ? Vous avez fait bien plus, ne pouvez-vous pas être lent ?

$i = 4;   //内核创建一个zval指针,并且为其以堆的方式开辟空间,让指针指向这个空间,将zval中的成员引用计数置为1,类型标记为整形,
并且申请一个zvalue_value指针,同样以堆的方式以其开辟空间,同时将该联合体中的lval赋值为4,并且在symbal_table的hash表中记录变量i和zval指针的映射关系
$j = $i;   //没有在申请内存空间,在zval的成员中引用计数标记为
2$j = 5;   //内核重新创建zval指针,重复下上面的步骤,我就不重复说明了,重点是将旧的zval引用计数标记为1

Quand PHP attribue des valeurs à des variables comme
  1. i, il n'y a pas surcharge de mémoire Oui, c'est-à-dire que si vous attribuez des dizaines de milliers de valeurs, le nombre de références ne deviendra que des dizaines de milliers. C'est différent du langage C. Lorsque la valeur de la variable change, l'espace mémoire sera rouvert. Ce mécanisme est appelé mécanisme de copie sur écriture
  2. La dernière partie : la partie objet PHP est référencée par défaut, donc même si les variables membres de l'objet sont modifiées après l'affectation, la copie sur écriture ne sera pas activée, comme indiqué ci-dessous Recommandations associées :

    Comparaison des performances entre les références et non-références de variables PHP

Résumé des exemples de méthodes de substitution de variables 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!

Déclaration:
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