• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP内核-简单讲解PHP灵魂HashTble

php 搞代码 3年前 (2022-01-22) 19次浏览 已收录 0个评论
{    zval *fooval;     MAKE_STD_ZVAL(fooval);    ZVAL_STRING(fooval, "hello", 1);    ZEND_SET_SYMBOL( EG(active_symbol_table) ,  "foo" , fooval);}
struct _zend_executor_globals {       ...         ...	HashTable *active_symbol_table; /*活动符号表*/	HashTable symbol_table;		/* 全局符号表 */	HashTable included_files;	/* files already included */     ...}
struct _zend_execute_data {	struct _zend_op *opline;	zend_function_state function_state;	zend_op_array *op_array;//函数编译后的执行逻辑,编译后的opcode二进制代码,称为op_array	zval *object;	HashTable *symbol_table;//此函数的符号表地址	struct _zend_execute_data *prev_execute_data;	zval *old_error_reporting;	zend_bool nested;	zval **original_return_value;	zend_class_entry *current_scope;	zend_class_entry *current_called_scope;	zval *current_this;  	struct _zend_op *fast_ret; /* used by FAST_CALL/FAST_RET (finally keyword) */	call_slot *call_slots;	call_slot *call;};
struct _zend_execute_data {	struct _zend_op *opline;	zend_function_state function_state;	zend_op_array *op_array;//函数编译后的执行逻辑,编译后的opcode二进制代码,称为op_array	zval *object;	HashTable *symbol_table;//此函数的符号表地址	struct _zend_execute_data *prev_execute_data;	zval *old_error_reporting;	zend_bool nested;	zval **original_return_value;	zend_class_entry *current_scope;	zend_class_entry *current_called_scope;	zval *current_this;  	struct _zend_op *fast_ret; /* used by FAST_CALL/FAST_RET (finally keyword) */	call_slot *call_slots;	call_slot *call;};
typedef struct bucket {	ulong h;						/* Used for numeric indexing */	uint nKeyLength;	void *pData;	void *pDataPtr;	struct bucket *pListNext;	struct bucket *pListLast;	struct bucket *pNext;	struct bucket *pLast;	const char *arKey;} Bucket;typedef struct _hashtable {     uint nTableSize;        // hash Bucket的大小,最小为8,以2x增长。    uint nTableMask;        // nTableSize-1 , 索引取值的优化    uint nNumOfElements;    // hash Bucket中当前存在的元素个数,count()函数会直接返回此值     ulong nNextFreeElement; // 下一个数字索引的位置    Bucket *pInternalPointer;   // 当前遍历的指针(foreach比for快的原因之一)    Bucket *pListHead;          // 存储数组头元素指针    Bucket *pListTail;          // 存储数组尾元素指针    Bucket **arBuckets;         // 存储hash数组    dtor_func_t pDestructor;    // 在删除元素时执行的回调函数,用于资源的释放    zend_bool persistent;       //指出了Bucket内存分配的方式。如果persisient为TRUE,则使用操作系统本身的内存分配函数为Bucket分配内存,否则使用PHP的内存分配函数。    unsigned char nApplyCount; // 标记当前has<a style="color:transparent">来@源gao*daima.com搞@代#码网</a><strong>搞gaodaima代码</strong>h Bucket被递归访问的次数(防止多次递归)    zend_bool bApplyProtection;// 标记当前hash桶允许不允许多次访问,不允许时,最多只能递归3次#if ZEND_DEBUG    int inconsistent;#endif} HashTable;

Zend/zend_compiles.h 261行,op_array结构代码

struct _zend_op_array {	/* Common elements */	zend_uchar type;	const 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;	/* END of common elements */	zend_uint *refcount;	zend_op *opcodes;	zend_uint last;	zend_compiled_variable *vars;	int last_var;	zend_uint T;	zend_uint nested_calls;	zend_uint used_stack;	zend_brk_cont_element *brk_cont_array;	int last_brk_cont;	zend_try_catch_element *try_catch_array;	int last_try_catch;	zend_bool has_finally_block;	/* static variables support */	HashTable *static_variables;	zend_uint this_var;	const char *filename;	zend_uint line_start;	zend_uint line_end;	const char *doc_comment;	zend_uint doc_comment_len;	zend_uint early_binding; /* the linked list of delayed declarations */	zend_literal *literals;	int last_literal;	void **run_time_cache;	int  last_cache_slot;	void *reserved[ZEND_MAX_RESERVED_RESOURCES];};

以上就是PHP内核-简单讲解PHP灵魂HashTble的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP内核-简单讲解PHP灵魂HashTble
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址