• PHP代码实现3 [函数角度]


    内部函数

    标准函数的实现存放在ext/standard扩展目录中。

    php函数种类

    Zend engine中的function的存在形式

    1
    2
    3
    4
    5
    6
    struct _zend_execute_data {
    //...省略部分代码
    zend_function_state function_state;
    zend_function *fbc; /* Function Being Called */
    //...省略部分代码
    };

    zend_function 的存在形式 Union!

    联合体的所有成员变量共享内存中的一块内存,在某个时刻只能有一个成员使用这块内存, 并且当使用某一个成员时,其仅能按照它的类型和内存大小修改对应的内存空间。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    typedef union _zend_function {
    zend_uchar type; /* 如用户自定义则为 #define ZEND_USER_FUNCTION 2
    MUST be the first element of this struct! */

    struct {
    zend_uchar type; /* never used */
    char *function_name; //函数名称
    zend_class_entry *scope; //函数所在的类作用域
    zend_uint fn_flags; // 作为方法时的访问类型等,如ZEND_ACC_STATIC等
    union _zend_function *prototype; //函数原型
    zend_uint num_args; //参数数目
    zend_uint required_num_args; //需要的参数数目
    zend_arg_info *arg_info; //参数信息指针
    zend_bool pass_rest_by_reference;
    unsigned char return_reference; //返回值
    } common;

    zend_op_array op_array; //函数中的操作
    zend_internal_function internal_function;
    } zend_function;
    • 在PHP的实现中,即使没有显式的返回, Zend引擎也会“帮你“返回NULL。
    1
    2
    3
    4
    $func = 'print_r';
    $func('i am print_r function.');

    print_r('i am print_r function.');

    变量函数是DO_FCALL_BY_NAME,而内部函数是DO_FCALL。这在语法解析时就已经决定了

    如果不是方法,并且不是动态调用,并且函数名为字符串常量,则其生成的中间代码为ZEND_DO_FCALL。其它情况则为ZEND_DO_FCALL_BY_NAME。

  • 相关阅读:
    Socket编程注意接收缓冲区大小
    Ubuntu 14.04环境变量修改
    python模块------json
    解决ssh连接linux系统特别慢的问题
    centos7 安装 ftp 服务及创建 repo源
    qcow2镜像制作
    k8s-helm01-----helm基本使用
    mysql常用sql
    js中自执行函数(function(){})()和(function(){}())区别
    npm镜像指定用淘宝镜像去下载
  • 原文地址:https://www.cnblogs.com/xiaoerli520/p/9624237.html
Copyright © 2020-2023  润新知