首頁  >  文章  >  後端開發  >  PHP7核心剖析6之函數

PHP7核心剖析6之函數

不言
不言原創
2018-04-13 15:06:271469瀏覽

這篇文章的內容介紹的是關於PHP7核心剖析6之函數,現在分享給大家,有需要的朋友可以參考一下 

 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

PHP7核心剖析6之函數

EG的function_table屬性是一個雜湊表,記錄的就是PHP中所有的函數


2.函數參數

函數參數在核心實作上與函數內的局部變數實際上是一樣的,函數在呼叫時會先在呼叫位置將參數的value複製到各參數各自的位置
//参数的额外信息
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;
以上所有參數結果保存在zend_op_array.arg_info數組,如果函數聲明了返回值類型則也會為它創建一個zend_arg_info,這個結構在arg_info數組的第一個位置,這種情況下zend_op_array->arg_info指向的實際是數組的第二個位置,返回值的結構透過zend_op_array->arg_info[-1]讀取


##3.內部函數

內部函數指的是由核心、擴充提供的C語言所寫的function,這類函數不需要經歷opcode的編譯過程,所以效率上要高於PHP用戶自訂的函數,呼叫時與普通的C程式沒有差異。 Zend引擎中定義了許多內部函數供使用者在PHP中使用,例如:define、defined、strlen、method_exists、class_exists、function_exists......等等,除了Zend引擎中定義的內部函數,PHP擴充中也提供了大量內部函數,我們也可以靈活的透過擴充自行自訂。
//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;

 相關建議:

##PHP7核心剖析5之PHP程式碼的編譯  

##PHP7核心剖析4之局部變數,全域變量,常數

PHP7核心剖析3之變項

                        問題  

以上是PHP7核心剖析6之函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn