Maison >développement back-end >tutoriel php >Analyse du noyau PHP7 6 fonctions

Analyse du noyau PHP7 6 fonctions

不言
不言original
2018-04-13 15:06:271553parcourir

Le contenu de cet article présente les fonctions d'analyse du noyau PHP7 6. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

1. >

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

Analyse du noyau PHP7 6 fonctions

L'attribut function_table d'EG est une table de hachage, qui enregistre toutes les fonctions en PHP


2. Paramètres de fonction

Les paramètres de fonction dans l'implémentation du noyau sont en fait les mêmes que les variables locales dans la fonction. Lorsque la fonction est appelée, elle le sera. soyez d'abord à l'emplacement appelant Copiez la valeur du paramètre à l'emplacement respectif de chaque paramètre
//参数的额外信息
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;
Tous les résultats des paramètres ci-dessus sont enregistrés dans le tableau zend_op_array.arg_info Si la fonction déclare un type de valeur de retour. , un zend_arg_info sera également créé pour cela. Cette structure est en première position du tableau arg_info. Dans ce cas, zend_op_array->arg_info pointe en fait vers la deuxième position du tableau. zend_op_array->arg_info[-1]


3. Fonctions internes

Les fonctions internes font référence aux fonctions écrites en langage C fournies. par le noyau et les extensions. De telles fonctions n'ont pas besoin de passer par le processus de compilation d'opcode, donc l'efficacité est supérieure à celle des fonctions PHP définies par l'utilisateur, et il n'y a aucune différence avec les programmes C ordinaires lorsqu'ils sont appelés. Le moteur Zend définit de nombreuses fonctions internes que les utilisateurs peuvent utiliser en PHP, telles que : définir, défini, strlen, method_exists, class_exists, function_exists...etc., en plus des fonctions internes définies dans le moteur Zend, des extensions PHP également A un grand nombre de fonctions internes sont fournies et nous pouvons également les personnaliser de manière flexible grâce à des extensions.
//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;
Recommandations associées :

Analyse du noyau PHP7 5 - Compilation du code PHP

Analyse du noyau PHP7 4 - Variables locales, Variables globales, constantes

Analyse du noyau PHP7 3 variables

                                                   

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn