PHP原理之变量作用域的案例发现

  介绍

这篇文章主要介绍了PHP原理之变量作用域的案例发现,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。

前面的文章(深入理解PHP原理之变量(变量内部PHP)介绍了PHP变量的内部表示,但是,问题是,这些内部表示是如何和用户脚本中的变量联系起来的呢?也就是说,如果我在脚本中写下:

& lt; PHP ?   $ var=發aruence";   echo $ var;   ?在

泽是如何把我的变量var和内部结构zval联系起来的呢?

深入理解PHP原理之变量中讲过,PHP内部都是使用zval来表示变量的,但是对于上面的脚本,我们的变量是有名字的,var。而zval中并没有相应的字段来体现变量名。

如果你想到了PHP内部一定有一个机制,来实现变量名到zval的映射。那么你真的是很聪明,;)

在PHP中,所有的变量都会存储在一个数组中(确切的说是<强>哈希表),并且,<强> PHP也是通过不同的数组来实现变量的作用域的

当你创建一个变量的时候,PHP会为这个变量分配一个zval,填入相应的变量值,然后将这个变量的名字,和指向这个zval的指针填入一个数组中,然后,当你获取这个变量的时候,PHP会通过查找这个数组,获得对应的zval。

查看_zend_executor_globals结构(这个结构在PHP的执行器保存一些执行相关的上下文信息)

struct _zend_executor_globals {      ....   散列表* active_symbol_table;/*活动符号表*/HashTable symbol_table;/*全局符号表*/HashTable included_files;      jmp_buf *救助;   int error_reporting;   …   }

其中,<强>全局符号表强,保存了在顶层作用域(就是不在任何函数,对象内)的变量。每当调用一个函数(对象的方法)的时候,就会为这个函数创建一个活动符号表,所有在这个函数内定义的变量,都会保存在这个活动符号表中。

对,这就是PHP的变量作用域的实现方式!举个列子:

& lt; php ?   $ var=拔以谌址舤able";   函数示例(para美元){   $ var=拔以诨钤総able"象征;   echo $ var;   }   样本($ var);   echo $ var;   祝辞;

在函数样本外面的变量$ var,它会被填入全局符号表中,与他对应的有一个zval指针,这个zval保存了一个字符串全局符号表中的“我”。

函数内的$ var,它会被填入属于函数样本的活动符号表中,一样的,与他对应的zval中,保存着字符串在活跃的符号表”“我。

比较特殊的,就是函数样本的参数对位了美元,这个对位是美元保存在样本的活动符号表的,但是与他对应的zval指针,会指向一个保存一份全局变量$ var的副本的zval(严格来讲不是复制,是引用)。

感谢你能够认真阅读完这篇文章,希望小编分享PHP原理之变量作用域的案例发现内容对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,遇到问题就找,详细的解决方法等着你来学习!

PHP原理之变量作用域的案例发现