PHP中函数的内部类型

阅读PHP源码有一个非常重要的函数: zend_do_fcall_common_helper_SPEC (in Zend/zend_vm_execute.h);

PHP中有很多现有的函数是用C写的, 称之为: ZEND_INTERNAL_FUNCTION ; 还有一部分是我们自己使用function关键字定义的,这部分称为: ZEND_USER_FUNCTION ; 对于类也有这种区别,用C写的那部分类,称之为: ZEND_INTERNAL_CLASS; 我们自己使用class关键字定义的类,称为:ZEND_USER_CLASS ; 相关定义可参看: Zend/zend_compile.h

通过函数zend_do_fcall_common_helper_SPEC() , 我们可以知道内部函数和用户函数分别是怎么执行的。 内部函数通过函数 zend_execute_internal 来执行, 用户函数是通过函数 zend_execute来解释执行opcode的。

PHP中函数的存储结构:
———————- in zend_compile.h ———————-
typedef union _zend_function {
    zend_uchar type;    /* 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;
        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;
其中,type标识的是内部函数还是用户函数
————————————————-

关于类的存储结构,参看Zend/zend.h 中结构体 _zend_class_entry,其中也有一个type属性来标识了内部类还是用户类了;

作业: foreach一个类的时候,能看到那些属性或函数,内部类和用户类表现一样吗?为什么?

1. foreach内部类的时候,什么也看不到
2. foreach用户类的使用,public的属性可以看到,private的属性或任意访问权限的成员方法是看不见的。

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据