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; }
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
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)
Les 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
< du constructeur 🎜>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!