`
tiandirensoon
  • 浏览: 595789 次
文章分类
社区版块
存档分类
最新评论

深入理解PHP原理之变量作用域

 
阅读更多

作者:laruence(http://www.laruence.com/)
地址: http://www.laruence.com/2008/08/26/463.html


PHP变量的内部表示是如何和用户脚本中的变量联系起来的呢?也就是说,如果我在脚本中写下:
<?php
$var="laruence";
echo$var;
?>

ZE是如何把我的变量var和内部结构zval联系起来的呢?
深入理解PHP原理之变量中讲过,PHP内部都是使用zval来表示变量的,但是对于上面的脚本,我们的变量是有名字的, var。而zval中并没有相应的字段来体现变量名。
如果你想到了PHP内部一定有一个机制,来实现变量名到zval的映射。那么你真的是很聪明,;)
在PHP中,所有的变量都会存储在一个数组中(确切的说是hash table), 并且,PHP也是通过不同的数组来实现变量的作用域的。
当你创建一个变量的时候,PHP会为这个变量分配一个zval,填入相应的变量值,然后将这个变量的名字,和指向这个zval的指针填入一个数组中。然后,当你获取这个变量的时候,PHP会通过查找这个数组,获得对应的zval。
查看_zend_executor_globals结构(这个结构在PHP的执行器保存一些执行相关的上下文信息)
struct
_zend_executor_globals
{

....
HashTable*active_symbol_table;/*活动符号表*/
HashTable
symbol_table; /*全局符号表*/
HashTable
included_files;

jmp_buf*bailout;
interror_reporting;
.....
}

其中,全局符号表,保存了在顶层作用域(就是不在任何函数,对象内)的变量。每当调用一个函数(对象的方法)的时候,就会为这个函数创建一个活动符号表,所有在这个函数内定义的变量,都会保存在这个活动符号表中。
对,这就是PHP的变量作用域的实现方式! 举个列子:
<?php
$var="I am in the global symbol table";
functionsample($para){
$var="I am in the active symbol table";
echo$var;
}
sample($var);
echo$var;
?>

在函数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来实现传值的,呵呵,留个悬念,等我下回分解.

分享到:
评论

相关推荐

    深入了解php底层机制

    13、Php的四层体系…24、Sapi35、Php的执行流程&opcode.56、HashTable—核心数据结构…67、Php变量…8概述…8Zval9整数、浮点数类型变量…10字符串变量…10数组变量…11资源类型变量…11Php变量的作用域…...

    PHP和MySQL Web开发第4版pdf以及源码

    12.1 深入理解权限系统 12.1.1 user表 12.1.2 db表和host表 12.1.3 tables_priv表,columns_priv表和procs_priv表 12.1.4 访问控制:MySQL如何使用Grant表 12.1.5 更新权限:修改什么时候生效 12.2 提高MySQL...

    PHP和MySQL WEB开发(第4版)

    12.1 深入理解权限系统 12.1.1 user表 12.1.2 db表和host表 12.1.3 tables_priv表,columns_priv表和procs_priv表 12.1.4 访问控制:MySQL如何使用Grant表 12.1.5 更新权限:修改什么时候生效 12.2 提高MySQL数据库...

    (全)传智播客PHP就业班视频完整课程

    9-30 2 javascript的闭包 js变量作用域 9-30 3 仿超级玛丽兄弟游戏制作 9-30 4 构造方法 对象的常用操作 9-30 5 面向对象的封装 继承 多态 9-30 6 面向对象的封装 继承 多态2 9-5 1.php xml编程①-xml基本介绍 xml...

    史上最全韩顺平传智播客PHP就业班视频,10月份全集

    9-30 2 javascript的闭包 js变量作用域 9-30 3 仿超级玛丽兄弟游戏制作 9-30 4 构造方法 对象的常用操作 9-30 5 面向对象的封装 继承 多态 9-30 6 面向对象的封装 继承 多态2 9-5 1.php xml编程①-xml基本介绍 xml...

    史上最全韩顺平传智播客PHP就业班视频,9月份全集

    9-30 2 javascript的闭包 js变量作用域 9-30 3 仿超级玛丽兄弟游戏制作 9-30 4 构造方法 对象的常用操作 9-30 5 面向对象的封装 继承 多态 9-30 6 面向对象的封装 继承 多态2 9-5 1.php xml编程①-xml基本介绍 xml...

    PHP和MySQL Web开发第4版

    12.1 深入理解权限系统 12.1.1 user表 12.1.2 db表和host表 12.1.3 tables_priv表,columns_priv表和procs_priv表 12.1.4 访问控制:MySQL如何使用Grant表 12.1.5 更新权限:修改什么时候生效 12.2 提高MySQL...

    韩顺平PHP JS JQUERY 所有视频下载种子 货真价实

    9-30 2 javascript的闭包 js变量作用域 9-30 3 仿超级玛丽兄弟游戏制作 9-30 4 构造方法 对象的常用操作 9-30 5 面向对象的封装 继承 多态 9-30 6 面向对象的封装 继承 多态2 9-5 1.php xml编程①-xml基本介绍 xml...

    史上最全传智播客PHP就业班视频课,8月份视频

    9-30 2 javascript的闭包 js变量作用域 9-30 3 仿超级玛丽兄弟游戏制作 9-30 4 构造方法 对象的常用操作 9-30 5 面向对象的封装 继承 多态 9-30 6 面向对象的封装 继承 多态2 9-5 1.php xml编程①-xml基本介绍 xml...

    LINUX网站建设技术指南

    8.3.6 变量作用域 8.4 外界变量和交互式网页 8.4.1 PHP从客户端获取信息的方法:外界变量 8.4.2 使用HTTP Form获取信息 8.4.3 HTTP Cookies与客户端信息 8.4.4 使用环境变量获取客户端信息 8.5 基本控制流程:分支和...

Global site tag (gtag.js) - Google Analytics