Heim  >  Artikel  >  Backend-Entwicklung  >  Funktionen der PHP7-Kernelanalyse 6

Funktionen der PHP7-Kernelanalyse 6

不言
不言Original
2018-04-13 15:06:271522Durchsuche

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

Funktionen der PHP7-Kernelanalyse 6

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!

Stellungnahme:
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