深入理解PHP原理之变量作用域(Scope in PHP)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了深入理解PHP原理之变量作用域(Scope in PHP),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2068字,纯文字阅读大概需要3分钟。
内容图文
![深入理解PHP原理之变量作用域(Scope in PHP)](/upload/InfoBanner/zyjiaocheng/127/3bc168659417424cbb73b7fff87de366.jpg)
![深入理解PHP原理之变量作用域(Scope in PHP) - 文章图片](/upload/getfiles/0001/2021/4/21/20210421015009240.jpg)
前面的文章(深入理解PHP原理之变量(Variables inside PHP))介绍了PHP变量的内部表示,但是,问题是,这些内部表示是如何和用户脚本中的变量联系起来的呢?也就是说,如果我在脚本中写下:
<?php $var = "laruence"; echo $var; ?>
ZE是如何把我的变量var和内部结构zval联系起来的呢?
深入理解PHP原理之变量中讲过,PHP内部都是使用zval来表示变量的,但是对于上面的脚本,我们的变量是有名字的, var。而zval中并没有相应的字段来体现变量名。
如果你想到了PHP内部一定有一个机制,来实现变量名到zval的映射。那么你真的是很聪明,;)
推荐学习:PHP视频教程
在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; int error_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,是引用)。
以上就是深入理解PHP原理之变量作用域(Scope in PHP)的详细内容。
内容总结
以上是互联网集市为您收集整理的深入理解PHP原理之变量作用域(Scope in PHP)全部内容,希望文章能够帮你解决深入理解PHP原理之变量作用域(Scope in PHP)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。