阅读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的属性或任意访问权限的成员方法是看不见的。