深入理解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";
function sample($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原理之变量作用域相关推荐
- 深入理解PHP原理之变量分离/引用(Variables Separation)
引自: http://www.laruence.com/ [风雪之隅 ] 在前面的文章中我已经介绍了PHP的变量的内部表示(深入理解PHP原理之变量(Variables inside PHP)),以及 ...
- 深入理解PHP原理之变量(Variables inside PHP)
或许你知道,或许你不知道,PHP是一个弱类型,动态的脚本语言.所谓弱类型,就是说PHP并不严格验证变量类型(严格来讲,PHP是一个中强类型语言,这部分内容会在以后的文章中叙述),在申明一个变量的时候, ...
- 深入理解JS中的变量作用域
在JS当中一个变量的作用域(scope)是程序中定义这个变量的区域.变量分为两类:全局(global)的和局部的.其中全局变量的作用域是全局性的,即在JavaScript代码中,它处处都有定义.而在函 ...
- php 生命变量,深入理解PHP原理之变量生命期(一)
对于PHP的中的数据来源, 不外乎有俩种: 1. 来自代码中 2. 来自外部(GET/POST/DB) 对于代码中的变量(也就是直接量)来说, 变量分配/赋值在编译期, 活跃在执行器, 在请求关闭期被 ...
- python函数对变量的作用域_python函数变量作用域如何理解使用?
大家对于这个名词"变量作用域"有了解过吗?如果大家没有听说过,小编可以协助大家理解下,拆分出来变量的定义,比如,函数里面去定义变量的,这种叫做局部变量,反之,不再函数里面的,那肯定 ...
- java 变量作用域 c语言_C语言深入理解 - 常量与变量
++++++++++++++++++++++++++++++++++++++++++ <C语言深入理解系列 - 常量与变量> 查看其它博文请关注原创作者. 本文系本站原创,欢迎转载! 转载 ...
- 深入理解JavaScript的变量作用域
在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...
- JavaScript的变量作用域深入理解(转)
在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整 ...
- 深入理解JavaScript的变量作用域(转)
在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...
最新文章
- 阿里90后科学家研发,达摩院开源新一代AI算法模型
- 信号完整性(四):信号振铃是怎么产生的
- python 批量下载网址_python 遍历oss 实现批量下载
- Python列表操作:统计列表中的重复项出现的次数的方法,不懂也要知道的python知识
- 子线程中更新UI线程的三个方法
- RHEL 6安装中的问题
- 如何在word中像LaTeX一样键入公式
- 记一次Springboot启动异常
- 面试突然问Java多线程底层原理,我哭了!
- XJOI 3281 A * B Problem again 题解
- ExtJS 教程汇总
- wordpress最佳架构_生活教练的22个最佳WordPress主题
- windows系统统不支持mysql_Windows系统下MySQL无法启动的万能解决方法
- 7z解压crc错误_百度网盘压缩下载文件的CRC校验错误的解决方法
- 冷启动中的多臂老虎机问题(Multi-Armed Bandit,MAB)
- 二、为jupyter notebook 添加标题
- 【循序渐进学Python】面向对象知多少——魔方方法
- 34.发送ICMP时间戳请求
- Android序列化经典解析(三)-拨乱反正,堪比窦娥的Serializable
- 纳兰性德(摘自baike)
热门文章
- 不属于未来计算机范畴,智慧职教云课堂工程数学-2020年春网课答案
- python 正则表达式方法_Python正则表达式一: 基本使用方法
- 网站服务器的ip地址会变吗,网站的服务器变了 IP地址变吗
- linux操作系统的两种桌面环境,Linux操作系统中常见的桌面环境介绍
- 和12岁小同志搞创客开发:如何使用继电器?
- GitHub开源的AI下五子棋(基于博弈树极大极小值alpha-beta剪枝搜索)
- 如何高效便捷的画出炫酷神经网络图
- Linux那些事儿 之 戏说USB(4)最终奥义
- populate_dir
- HC-05与HC-06的AT指令的区别