之变量作用域(Scope in PHP)
来源:互联网 发布:MySQL 设置多个主键 编辑:程序博客网 时间:2024/06/06 09:05
我前面的文章(深入理解PHP原理之变量(Variables inside PHP))介绍了PHP变量的内部表示,但是,问题是,这些内部表示是如何和用户脚本中的变量联系起来的呢?也就是说,如果我在脚本中写下:
1. <?php
2. $var ="laruence";
3. echo$var;
4. ?>
ZE是如何把我的变量var和内部结构zval联系起来的呢?
深入理解PHP原理之变量中讲过,PHP内部都是使用zval来表示变量的,但是对于上面的脚本,我们的变量是有名字的, var。而zval中并没有相应的字段来体现变量名。
如果你想到了PHP内部一定有一个机制,来实现变量名到zval的映射。那么你真的是很聪明,;)
在PHP中,所有的变量都会存储在一个数组中(确切的说是hash table),并且,PHP也是通过不同的数组来实现变量的作用域的。
当你创建一个变量的时候,PHP会为这个变量分配一个zval,填入相应的变量值,然后将这个变量的名字,和指向这个zval的指针填入一个数组中。然后,当你获取这个变量的时候,PHP会通过查找这个数组,获得对应的zval。
查看_zend_executor_globals结构(这个结构在PHP的执行器保存一些执行相关的上下文信息)
1. struct _zend_executor_globals {
2.
3. ....
4. HashTable *active_symbol_table;/*活动符号表*/
5. HashTablesymbol_table; /*全局符号表*/
6.
7. HashTableincluded_files;
8.
9. jmp_buf *bailout;
10. int error_reporting;
11. .....
12. }
13.
其中,全局符号表,保存了在顶层作用域(就是不在任何函数,对象内)的变量。每当调用一个函数(对象的方法)的时候,就会为这个函数创建一个活动符号表,所有在这个函数内定义的变量,都会保存在这个活动符号表中。
对,这就是PHP的变量作用域的实现方式!举个列子:
1. <?php
2. $var ="I am in the global symbol table";
3. functionsample($para){
4. $var ="I am in the active symbol table";
5. echo$var;
6. }
7. sample($var);
8. echo$var;
9. ?>
在函数sample外面的变量$var,它会被填入全局符号表中,与他对应的有一个zval指针,这个zval保存了一个字符串”I am in the global symbol table”.
函数内的$var, 它会被填入属于函数sample的活动符号表中,一样的,与他对应的zval中,保存着字符串”I am in the active symbol table
“.
比较特殊的,就是函数sample的参数$para了,这个$para是保存在sample的活动符号表的,但是与他对应的zval指针,会指向一个保存一份全局变量$var的copy的zval(严格来讲不是copy,是引用,这个涉及到变量的copy on write机制,我会在以后介绍)。
我们都知道PHP对于简单变量是传值调用的,但是,我要告诉你的是,PHP并不是简单的通过复制一个zval来实现传值的,呵呵,留个悬念,等我下回分解.
- 之变量作用域(Scope in PHP)
- 深入理解PHP原理之变量作用域(Scope in PHP)
- 深入理解PHP原理之变量作用域(Scope in PHP)
- 之变量分离/引用(Scope in PHP)
- java变量作用域Scope
- java变量作用域Scope
- Spring之scope作用域
- angularJs 之 Scope(作用域)
- AngularJs之Scope作用域
- jstl变量作用域控制 scope
- 变量作用域(Variable Scope)
- js变量提升,scope作用域
- AngularJS的scope变量的作用域
- php变量作用域
- php变量作用域
- php变量作用域
- php变量作用域
- php变量作用域
- IOS 学习 执行动画
- lua中查找表的过程已经(以及对元表和__index方法的理解)
- 之弱类型变量(Variables inside PHP)
- codeforces 309A Morning run 概率
- 【Material Design视觉设计语言】应用动画设计
- 之变量作用域(Scope in PHP)
- IOS 学习 模型初始化的方法
- PHP和Nginx的通信方式
- I18N/L10N 是什么
- 基于Web和二维码的文件传输服务
- 之变量分离/引用(Scope in PHP)
- poj-2104(主席树)
- cJSON库使用教程
- 函数