加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 教程 > 正文

PHP内核中核心的两个全局变量

发布时间:2021-12-11 12:01:32 所属栏目:教程 来源:互联网
导读:在阅读PHP源码的时候,会遇到很多诸如:CG(),EG() 这样的宏,如果不了解这些宏的意义,会给理解源码造成很大困难。 Zend引擎中有两个重要的全局变量结构体,就是Zend引擎关闭之前都会存在的变量: typedef struct _zend_compiler_globals zend_compiler_glo

在阅读PHP源码的时候,会遇到很多诸如:CG(),EG() 这样的宏,如果不了解这些宏的意义,会给理解源码造成很大困难。
 
Zend引擎中有两个重要的全局变量结构体,就是Zend引擎关闭之前都会存在的变量:
 
typedef struct _zend_compiler_globals zend_compiler_globals;
typedef struct _zend_executor_globals zend_executor_globals;
 
/* Compiler */
#ifdef ZTS
# define CG(v) TSRMG(compiler_globals_id, zend_compiler_globals *, v)
int zendparse(void *compiler_globals);
#else
# define CG(v) (compiler_globals.v)
extern ZEND_API struct _zend_compiler_globals compiler_globals;
int zendparse(void);
#endif
 
 
/* Executor */
#ifdef ZTS
# define EG(v) TSRMG(executor_globals_id, zend_executor_globals *, v)
#else
# define EG(v) (executor_globals.v)
extern ZEND_API zend_executor_globals executor_globals;
#endif
 
CG 的含义就是 compiler_globals ,Zend编译器相关的全局变量;
 
EG 的含义就是 executor_globals,Zend执行器相关的全局变量;
 
这两个结构都包含了很多元素,对理解PHP内核有很重要的意义:
 
struct _zend_compiler_globals {
 zend_stack bp_stack;
 zend_stack switch_cond_stack;
 zend_stack foreach_copy_stack;
 zend_stack object_stack;
 zend_stack declare_stack;
 
 zend_class_entry *active_class_entry;
 
 /* variables for list() compilation */
 zend_llist list_llist;
 zend_llist dimension_llist;
 zend_stack list_stack;
 
 zend_stack function_call_stack;
 
 char *compiled_filename;
 
 int zend_lineno;
 int comment_start_line;
 char *heredoc;
 int heredoc_len;
 
 zend_op_array *active_op_array;
 
 HashTable *function_table; /* function symbol table */
 HashTable *class_table;  /* class table */
 
 HashTable filenames_table;
 
 HashTable *auto_globals;
 
 zend_bool in_compilation;
 zend_bool short_tags;
 zend_bool asp_tags;
 zend_bool allow_call_time_pass_reference;
 
 zend_declarables declarables;
 
 /* For extensions support */
 zend_bool extended_info; /* generate extension information for debugger/profiler */
 zend_bool handle_op_arrays; /* run op_arrays through op_array handlers */
 
 zend_bool unclean_shutdown;
 
 zend_bool ini_parser_unbuffered_errors;
 
 zend_llist open_files;
 
 long catch_begin;
 
 struct _zend_ini_parser_param *ini_parser_param;
 
 int interactive;
 
 zend_uint start_lineno;
 zend_bool increment_lineno;
 
 znode implementing_class;
 
 zend_uint access_type;
 
 char *doc_comment;
 zend_uint doc_comment_len;
 
#ifdef ZEND_MULTIBYTE
 zend_encoding **script_encoding_list;
 int script_encoding_list_size;
 zend_bool detect_unicode;
 
 zend_encoding *internal_encoding;
 
 /* multibyte utility functions */
 zend_encoding_detector encoding_detector;
 zend_encoding_converter encoding_converter;
 zend_encoding_oddlen encoding_oddlen;
#endif /* ZEND_MULTIBYTE */
 
#ifdef ZTS
 HashTable **static_members;
 int last_static_member;
#endif
};
 
 
struct _zend_executor_globals {
 zval **return_value_ptr_ptr;
 
 zval uninitialized_zval;
 zval *uninitialized_zval_ptr;
 
 zval error_zval;
 zval *error_zval_ptr;
 
 zend_function_state *function_state_ptr;
 zend_ptr_stack arg_types_stack;
 
 /* symbol table cache */
 HashTable *symtable_cache[SYMTABLE_CACHE_SIZE];
 HashTable **symtable_cache_limit;
 HashTable **symtable_cache_ptr;
 
 zend_op **opline_ptr;
 
 HashTable *active_symbol_table;
 HashTable symbol_table;  /* main symbol table */
 
 HashTable included_files; /* files already included */
 
 jmp_buf *bailout;
 
 int error_reporting;
 int orig_error_reporting;
 int exit_status;
 
 zend_op_array *active_op_array;
 
 HashTable *function_table; /* function symbol table */
 HashTable *class_table;  /* class table */
 HashTable *zend_constants; /* constants table */
 
 zend_class_entry *scope;
 
 zval *This;
 
 long precision;
 
 int ticks_count;
 
 zend_bool in_execution;
 HashTable *in_autoload;
 zend_function *autoload_func;
 zend_bool full_tables_cleanup;
 zend_bool ze1_compatibility_mode;
 
 /* for extended information support */
 zend_bool no_extensions;
 
#ifdef ZEND_WIN32
 zend_bool timed_out;
#endif
 
 HashTable regular_list;
 HashTable persistent_list;
 
 zend_ptr_stack argument_stack;
 
 int user_error_handler_error_reporting;
 zval *user_error_handler;
 zval *user_exception_handler;
 zend_stack user_error_handlers_error_reporting;
 zend_ptr_stack user_error_handlers;
 zend_ptr_stack user_exception_handlers;
 
 /* timeout support */
 int timeout_seconds;
 
 int lambda_count;
 
 HashTable *ini_directives;
 HashTable *modified_ini_directives;
 
 zend_objects_store objects_store;
 zval *exception;
 zend_op *opline_before_exception;
 
 struct _zend_execute_data *current_execute_data;
 
 struct _zend_module_entry *current_module;
 
 zend_property_info std_property_info;
 
 zend_bool active;
 
 void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读