作者: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原理之变量作用域相关推荐

  1. 深入理解PHP原理之变量分离/引用(Variables Separation)

    引自: http://www.laruence.com/ [风雪之隅 ] 在前面的文章中我已经介绍了PHP的变量的内部表示(深入理解PHP原理之变量(Variables inside PHP)),以及 ...

  2. 深入理解PHP原理之变量(Variables inside PHP)

    或许你知道,或许你不知道,PHP是一个弱类型,动态的脚本语言.所谓弱类型,就是说PHP并不严格验证变量类型(严格来讲,PHP是一个中强类型语言,这部分内容会在以后的文章中叙述),在申明一个变量的时候, ...

  3. 深入理解JS中的变量作用域

    在JS当中一个变量的作用域(scope)是程序中定义这个变量的区域.变量分为两类:全局(global)的和局部的.其中全局变量的作用域是全局性的,即在JavaScript代码中,它处处都有定义.而在函 ...

  4. php 生命变量,深入理解PHP原理之变量生命期(一)

    对于PHP的中的数据来源, 不外乎有俩种: 1. 来自代码中 2. 来自外部(GET/POST/DB) 对于代码中的变量(也就是直接量)来说, 变量分配/赋值在编译期, 活跃在执行器, 在请求关闭期被 ...

  5. python函数对变量的作用域_python函数变量作用域如何理解使用?

    大家对于这个名词"变量作用域"有了解过吗?如果大家没有听说过,小编可以协助大家理解下,拆分出来变量的定义,比如,函数里面去定义变量的,这种叫做局部变量,反之,不再函数里面的,那肯定 ...

  6. java 变量作用域 c语言_C语言深入理解 - 常量与变量

    ++++++++++++++++++++++++++++++++++++++++++ <C语言深入理解系列 - 常量与变量> 查看其它博文请关注原创作者. 本文系本站原创,欢迎转载! 转载 ...

  7. 深入理解JavaScript的变量作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...

  8. JavaScript的变量作用域深入理解(转)

    在学习JavaScript的变量作用域之前,我们应当明确几点:  a.JavaScript的变量作用域是基于其特有的作用域链的.  b.JavaScript没有块级作用域.  c.函数中声明的变量在整 ...

  9. 深入理解JavaScript的变量作用域(转)

    在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数 ...

最新文章

  1. 阿里90后科学家研发,达摩院开源新一代AI算法模型
  2. 信号完整性(四):信号振铃是怎么产生的
  3. python 批量下载网址_python 遍历oss 实现批量下载
  4. Python列表操作:统计列表中的重复项出现的次数的方法,不懂也要知道的python知识
  5. 子线程中更新UI线程的三个方法
  6. RHEL 6安装中的问题
  7. 如何在word中像LaTeX一样键入公式
  8. 记一次Springboot启动异常
  9. 面试突然问Java多线程底层原理,我哭了!
  10. XJOI 3281 A * B Problem again 题解
  11. ExtJS 教程汇总
  12. wordpress最佳架构_生活教练的22个最佳WordPress主题
  13. windows系统统不支持mysql_Windows系统下MySQL无法启动的万能解决方法
  14. 7z解压crc错误_百度网盘压缩下载文件的CRC校验错误的解决方法
  15. 冷启动中的多臂老虎机问题(Multi-Armed Bandit,MAB)
  16. 二、为jupyter notebook 添加标题
  17. 【循序渐进学Python】面向对象知多少——魔方方法
  18. 34.发送ICMP时间戳请求
  19. Android序列化经典解析(三)-拨乱反正,堪比窦娥的Serializable
  20. 纳兰性德(摘自baike)

热门文章

  1. 不属于未来计算机范畴,智慧职教云课堂工程数学-2020年春网课答案
  2. python 正则表达式方法_Python正则表达式一: 基本使用方法
  3. 网站服务器的ip地址会变吗,网站的服务器变了 IP地址变吗
  4. linux操作系统的两种桌面环境,Linux操作系统中常见的桌面环境介绍
  5. 和12岁小同志搞创客开发:如何使用继电器?
  6. GitHub开源的AI下五子棋(基于博弈树极大极小值alpha-beta剪枝搜索)
  7. 如何高效便捷的画出炫酷神经网络图
  8. Linux那些事儿 之 戏说USB(4)最终奥义
  9. populate_dir
  10. HC-05与HC-06的AT指令的区别