Heim > Artikel > Backend-Entwicklung > PHP7 Kernel Analysis 8 und dergleichen
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 speichertstruct _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. 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"; } 在运行时再去检索。替换成为实际的值
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
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;
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) gespeichertMitgliedermethoden 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]; //普通属性值数组 };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:
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!