Der Inhalt dieses Artikels stellt die Funktionen der PHP7-Kernelanalyse 6 vor. Jetzt können Freunde in Not darauf verweisen
1. Die Speicherstruktur der Funktion
typedef union _zend_function zend_function; union _zend_function { zend_uchar type; struct { zend_uchar type; zend_uchar arg_flags[3]; uint32_t fn_flags; zend_string *function_name; zend_class_entry *scope; //成员方法所属类,面向对象实现中用到 union _zend_function *prototype; uint32_t num_args; //参数数量 uint32_t required_num_args; //必传参数数量 zend_arg_info *arg_info; //参数信息 } common; zend_op_array op_array; //自定义函数(函数实际编译为普通的zend_op_array) zend_internal_function internal_function; //内部函数(通过扩展或者内核提供的C函数) };
zend_function.common.xx快速访问到zend_function.zend_op_array.xx及zend_function.zend_internal_function.xx zend_function.type取到zend_function.op_array.type及zend_function.internal_function.type
EGs function_table-Attribut ist eine Hash-Tabelle, die alle Funktionen in PHP aufzeichnet
2. Funktionsparameter
Die Funktionsparameter in der Kernel-Implementierung sind tatsächlich dieselben wie die lokalen Variablen innerhalb der Funktion Zuerst am aufrufenden Ort sein. Kopieren Sie den Wert des Parameters an den entsprechenden Ort jedes Parameters.
//参数的额外信息 typedef struct _zend_arg_info { zend_string *name; //参数名 zend_string *class_name; zend_uchar type_hint; //显式声明的参数类型,比如(array $param_1) zend_uchar pass_by_reference; //是否引用传参,参数前加&的这个值就是1 zend_bool allow_null; //是否允许为NULL zend_bool is_variadic; //是否为可变参数,即...用法,function my_func($a, ...$b){...} } zend_arg_info;
Alle oben genannten Parameterergebnisse werden im Array zend_op_array.arg_info gespeichert, wenn die Funktion einen Rückgabewerttyp deklariert , es wird auch eine zend_arg_info erstellt. Diese Struktur befindet sich in der ersten Position des arg_info-Arrays. In diesem Fall zeigt zend_op_array->arg_info tatsächlich auf die zweite Position des Arrays zend_op_array->arg_info[-1]
3. Interne Funktionen
Interne Funktionen beziehen sich auf Funktionen, die in der bereitgestellten C-Sprache geschrieben sind Durch den Kernel und die Erweiterungen müssen solche Funktionen nicht den Opcode-Kompilierungsprozess durchlaufen, sodass die Effizienz höher ist als bei benutzerdefinierten PHP-Funktionen und beim Aufruf kein Unterschied zu gewöhnlichen C-Programmen besteht. Die Zend-Engine definiert viele interne Funktionen, die Benutzer in PHP verwenden können, wie zum Beispiel: define, define, strlen, method_exists, class_exists, function_exists ... usw. Zusätzlich zu den in der Zend-Engine definierten internen Funktionen gibt es auch PHP-Erweiterungen A Es stehen zahlreiche interne Funktionen zur Verfügung, die wir durch Erweiterungen auch flexibel anpassen können.
//zend_internal_function头部是一个与zend_op_array完全相同的common结构 typedef struct _zend_internal_function { /* Common elements */ zend_uchar type; zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */ uint32_t fn_flags; zend_string* function_name; zend_class_entry *scope; zend_function *prototype; uint32_t num_args; uint32_t required_num_args; zend_internal_arg_info *arg_info; /* END of common elements */ void (*handler)(INTERNAL_FUNCTION_PARAMETERS); //函数指针,展开:void (*handler)(zend_execute_data *execute_data, zval *return_value) struct _zend_module_entry *module; void *reserved[ZEND_MAX_RESERVED_RESOURCES]; } zend_internal_function;
Verwandte Empfehlungen:
PHP7-Kernel-Analyse 5 – Kompilierung von PHP-Code
PHP7-Kernel-Analyse 4 – Lokale Variablen, Globale Variablen, Konstanten
PHP7 Kernel Analysis 3 Variablen
Das obige ist der detaillierte Inhalt vonFunktionen der PHP7-Kernelanalyse 6. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!