欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

PHP内核中重要的两个全局变量

程序员文章站 2024-02-11 08:56:28
...
在阅读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];};