Skip to content

Commit d4902e8

Browse files
committed
添加全局变量的使用
1 parent 99ec127 commit d4902e8

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

book/chapt11/11-03-00-global-var.markdown

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 第三节 使用全局变量
22

3-
这里说的全局变量指的是我们在使用PHP中配合 `global` 关键字的变量。不是我们在PHP源码中的全局变量。
3+
这里说的全局变量指的是我们在使用PHP中配合 `global` 关键字的变量。
44

55
## 准备
66

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# 第三节 使用全局变量原理分析
2+
3+
仅仅会用调用 api 是不够的,能分析其背后的原理才更有意义,下面针对前面的每一步进行分析。
4+
因为PHP在编译的时候分为是否需要使用线程安全,
5+
可以先理解PHP的线程安全是对每个PHP线程中需要使用的全局变量的拷贝隔离,每个线程使用自己线程中得全局变量,互不干扰。
6+
归根结底和非线程安全下地原理是解耦,下面的一些宏都是添加了是否线程安全判断的,我们只需要分析非线程安全下的原理即可。
7+
8+
## 定义全局变量
9+
10+
对于 `ZEND_BEGIN_MODULE_GLOBALS``ZEND_END_MODULE_GLOBALS` 两个宏的定义在非线程安全下地定义
11+
12+
[c]
13+
#define ZEND_BEGIN_MODULE_GLOBALS(module_name) \
14+
typedef struct _zend_##module_name##_globals {
15+
#define ZEND_END_MODULE_GLOBALS(module_name) \
16+
} zend_##module_name##_globals;
17+
18+
也就说我们前面定义的
19+
20+
[c]
21+
ZEND_BEGIN_MODULE_GLOBALS(tipi_globals_demo)
22+
long global_value;
23+
ZEND_END_MODULE_GLOBALS(tipi_globals_demo)
24+
25+
展开之后就是
26+
27+
[c]
28+
typedef struct _zend_tipi_globals_demo_globals {
29+
long global_value;
30+
} zend_tipi_globals_demo_globals;
31+
32+
## 定义全局变量
33+
34+
[c]
35+
#define ZEND_DECLARE_MODULE_GLOBALS(module_name) \
36+
zend_##module_name##_globals module_name##_globals;
37+
38+
这里相当于声明了一个变量
39+
40+
[c]
41+
zend_tipi_globals_demo_globals tipi_globals_demo_globals;
42+
43+
## 初始化全局变量
44+
45+
[c]
46+
#define ZEND_INIT_MODULE_GLOBALS(module_name, globals_ctor, globals_dtor) \
47+
globals_ctor(&module_name##_globals);
48+
49+
前面我使用
50+
51+
[c]
52+
ZEND_INIT_MODULE_GLOBALS(tipi_globals_demo, php_tipi_globals_demo_init_globals, NULL);
53+
54+
就比较好理解了。
55+
56+
## 使用全局变量
57+
58+
[c]
59+
#define TIPI_GLOBALS_DEMO_G(v) (tipi_globals_demo_globals.v)
60+
61+
## 综述
62+
63+
在非线程安全的情况下,实际就是对C语言的全局变量使用的一个封装,并且是讲该模块的所有的全局变量放在以了一个结构体中。
64+
线程安全完整的分析可以参考[第八章 PHP中的线程安全](/book/?p=chapt08/08-03-zend-thread-safe-in-php)

0 commit comments

Comments
 (0)