Maison  >  Article  >  développement back-end  >  Analyse du noyau PHP7 8 et autres

Analyse du noyau PHP7 8 et autres

不言
不言original
2018-04-13 15:14:411551parcourir

Le contenu de cet article concerne l'analyse du noyau PHP7 8 et ainsi de suite. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

1. >La classe est le produit de la phase de compilation. Après la compilation, chaque classe que nous définissons générera un zend_class_entry, qui stocke toutes les informations de la classe pendant la phase d'exécution utilisent cette structure

struct _zend_class_entry {
    char type;          //类的类型:内部类ZEND_INTERNAL_CLASS(1)、用户自定义类ZEND_USER_CLASS(2)
    zend_string *name;  //类名,PHP类不区分大小写,统一为小写
    struct _zend_class_entry *parent; //父类
    int refcount;
    uint32_t ce_flags;  //类掩码,如普通类、抽象类、接口,

    int default_properties_count;        //普通属性数,包括public、private
    int default_static_members_count;    //静态属性数,static
    zval *default_properties_table;      //普通属性值数组
    zval *default_static_members_table;  //静态属性值数组
    zval *static_members_table;
    HashTable function_table;  //成员方法哈希表
    HashTable properties_info; //成员属性基本信息哈希表,key为成员名,value为zend_property_info
    HashTable constants_table; //常量哈希表,通过constant定义的

    //以下是构造函授、析构函数、魔术方法的指针
    union _zend_function *constructor;
    union _zend_function *destructor;
    union _zend_function *clone;
    union _zend_function *__get;
    union _zend_function *__set;
    union _zend_function *__unset;
    union _zend_function *__isset;
    union _zend_function *__call;
    union _zend_function *__callstatic;
    union _zend_function *__tostring;
    union _zend_function *__debugInfo;
    union _zend_function *serialize_func;
    union _zend_function *unserialize_func;
}


2. Constantes de classe

En PHP, les valeurs qui restent toujours inchangées dans la classe peuvent être définies comme constantes. la définition Il n'est pas nécessaire d'utiliser le symbole $ lors de l'utilisation de constantes. La valeur de la constante doit être une valeur fixe. Elles sont stockées via zend_class_entry.constants_table, qui est une structure de hachage

常量的读取:

class my_class {
    const A1 = "hi";
}
echo my_class::A1;

编译到echo my_class::A1这行时首先会尝试检索下是否已经编译了my_class,如果能在CG(class_table)中找到,则进一步从类的contants_table查找对应的常量,找到的话则会复制其value替换常量,简单的讲就是类似C语言中的宏,编译时替换为实际的值了,而不是在运行时再去检索。

echo my_class::A1;

class my_class {
    const A1 = "hi";
}

在运行时再去检索。替换成为实际的值


3. Les variables dans les attributs du membre

peuvent être initialisées, mais la valeur initialisée doit être une constante. La constante signifie ici que la valeur peut être obtenue par le. Script PHP pendant la phase de compilation. Il ne s'appuie pas sur les informations d'exécution pour évaluer, telles que public $time = time(); définir une propriété de cette manière déclenchera une erreur de syntaxe. Les attributs membres sont divisés en deux catégories : les attributs ordinaires et les attributs statiques. Différente de la méthode de stockage des constantes, la valeur d'initialisation des attributs membres n'est pas directement stockée dans la table de hachage avec le « nom de l'attribut » comme index, mais via. Le

Analyse du noyau PHP7 8 et autres enregistré dans le tableau est en fait simplement la VALEUR de l'attribut membre stocké dans le tableau. Lorsqu'il est accessible, il est toujours basé. sur le "nom de l'attribut" comme index. Recherchez la VALEUR spécifique dans la table de hachage, et cette table de hachage est zend_class_entry.properties_info

typedef struct _zend_property_info {
    uint32_t offset; //普通成员变量的内存偏移值,静态成员变量的数组索引
    uint32_t flags;  //属性掩码,如public、private、protected及是否为静态属性
    zend_string *name; //属性名:并不是原始属性名,private会在原始属性名前加上类名,protected则会加上*作为前缀
    zend_string *doc_comment;
    zend_class_entry *ce; //所属类
} zend_property_info;


4. Méthode membre

Chaque classe peut définir plusieurs fonctions (appelées méthodes membres) qui appartiennent à cette classe. Ces fonctions sont les mêmes que les fonctions ordinaires, mais sont gérées dans la dimension classe et ne sont donc pas globales. , les méthodes membres sont stockées dans la classe au lieu de EG(function_table)

Analyse du noyau PHP7 8 et autresLes méthodes membres sont également divisées en $this statiques et non statiques. ne peut pas être utilisé dans les méthodes statiques car la portée de leurs opérations est tout. Ce sont toutes des classes plutôt que des objets. Dans les méthodes non statiques, vous pouvez accéder aux attributs membres appartenant à cet objet via $this

.


5. Structure de données d'objet

Création d'objets : Tout d'abord, recherchez le zend_class_entry correspondant dans EG (class_table) en fonction du nom de la classe, puis créez et initialiser un objet, et enfin initialiser le zend_execute_data

Recommandations associées :
typedef struct _zend_object     zend_object;

struct _zend_object {
    zend_refcounted_h gc; //引用计数
    uint32_t          handle; //对象编号
    zend_class_entry *ce; //所属类
    const zend_object_handlers *handlers; //对象操作处理函数
    HashTable        *properties; //普通成员属性哈希表
    zval              properties_table[1]; //普通属性值数组
};

PHP7 Kernel Analysis 7 Zend Engine Execution Process

Analyse du noyau PHP7 6 Fonctions

Analyse du noyau PHP7 5 : Compilation de code 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