PHP7 Kernel Analysis 8 und dergleichen

不言
Freigeben: 2023-03-23 18:10:01
Original
1606 Leute haben es durchsucht

Der Inhalt dieses Artikels handelt von der PHP7-Kernelanalyse 8 und so weiter. Jetzt können Freunde in Not darauf verweisen

Klassenstruktur

Klasse ist das Produkt der Kompilierungsphase. Nach der Kompilierung generiert jede von uns definierte Klasse einen zend_class_entry, der alle Informationen der Klasse während der Ausführungsphase speichert
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;
}
Nach dem Login kopieren


2. Klassenkonstanten

In PHP können Werte, die in der Klasse immer unverändert bleiben, als Konstanten definiert werden die Definition Bei der Verwendung von Konstanten muss das $-Symbol nicht verwendet werden. Der Wert der Konstante muss über zend_class_entry.constants_table gespeichert werden, eine Hash-Struktur
常量的读取:

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";
}

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


3. Die Variablen in den Mitgliedsattributen

können initialisiert werden, der initialisierte Wert muss jedoch eine Konstante sein, die bedeutet, dass der Wert erhalten werden kann durch das PHP-Skript während der Kompilierungsphase nicht auf Laufzeitinformationen angewiesen, z. B. wenn public $time = time(); auf diese Weise definiert wird, wird ein Syntaxfehler ausgelöst.
Mitgliedsattribute werden in zwei Kategorien unterteilt: normale Attribute und statische Attribute. Anders als bei der Speichermethode von Konstanten wird der Initialisierungswert von Mitgliedsattributen nicht direkt in der Hash-Tabelle mit „Attributname“ als Index gespeichert, sondern durch Der im Array gespeicherte

PHP7 Kernel Analysis 8 und dergleichen

ist eigentlich nur der WERT des im Array gespeicherten Mitgliedsattributs. Beim Zugriff basiert es immer noch Suchen Sie den spezifischen WERT in der Hash-Tabelle, und diese Hash-Tabelle ist 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;
Nach dem Login kopieren


4. Mitgliedsmethode

Jede Klasse kann mehrere Funktionen (sogenannte Mitgliedsmethoden) definieren, die zu dieser Klasse gehören. Diese Funktionen sind die gleichen wie gewöhnliche Funktionen, werden jedoch in der Klassendimension verwaltet und sind daher nicht global , die Mitgliedsmethoden werden in der Klasse anstelle von EG(function_table) gespeichert

PHP7 Kernel Analysis 8 und dergleichen

Mitgliedermethoden sind auch in statische und nicht statische $this unterteilt kann nicht in statischen Methoden verwendet werden, da der Umfang ihrer Operationen alle ist. Sie sind alle Klassen und keine Objekte. In nicht statischen Methoden können Sie über $this

auf die zu diesem Objekt gehörenden Mitgliedsattribute zugreifen

5. Objektdatenstruktur

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]; //普通属性值数组
};
Nach dem Login kopieren
Erstellung von Objekten: Suchen Sie zuerst den entsprechenden zend_class_entry in EG (class_table) entsprechend dem Klassennamen, erstellen Sie dann und Initialisieren Sie ein Objekt und initialisieren Sie schließlich die zend_execute_data
Verwandte Empfehlungen:


PHP7 Kernel Analysis 7 Zend Engine Execution Process

Funktionen der PHP7-Kernelanalyse 6

PHP7-Kernelanalyse 5: Kompilierung von PHP-Code

Das obige ist der detaillierte Inhalt vonPHP7 Kernel Analysis 8 und dergleichen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage