- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PHP中的变量作用域
作者:廖宇雷()
前言:PHP 中的变量作用域表面上看似简单,但实际上是一个比较复杂的问题。如果能够更进一步的了解 PHP 中变量的作用域,不但能够避免一些奇怪的问题,而且还能利用一些特性来简化程序开发。
变量符号表
这个东西是我虚构出来的一个表格结构。每一个变量符号表里面保存着当前变量作用域中可用的变量。一个变量符号表的内容可能如左所示。 变量符号表是一个很简单的东西,但 PHP 引擎在执行代码时,需要从变量符号表中查找当前能够使用的变量,以及将初始化的变量添加到变量符号表中。后文简称变量符号表为“符号表”。
初始的符号表
在 PHP 引擎初始化时,会初始化一个变量符号表,这个符号表称为“初始符号表”,实际上
就是 PHP 的全局变量空间。所有的开发者定义的全局变量都保存在其中。 PHP 引擎在初始化任何符号表时,都会将 PHP 内部定义的超级全局变量添加到符号表中。这样,开发者就可以在程序的任何地方使用这些超级全局变量了。 要向符号表添加一个变量非常简单,只要初始化一个变量即可(给变量赋值)。
代码示例:
PHP 引擎执行到 $my_var = test 时,就会在符号表中添加一个新项目:
在上面示例接下来的代码中,就可以使用 $my_var 这个变量了。
超级全局变量
在 PHP 中,$_GET、$_POST 等一系列全局变量被称为超级全局变量。为什么叫做超级呢?是因为 PHP 引擎在创建一个新的符号表时,总是将这些超级变量添加到符号表中。由于有了这种“特殊待遇”,所以在 .php 文件的任何地方都可以直接使用这些超级全局变量。
PHP 的超级全局变量有:
$GLOBALS、$_SERVER、$_GET、$_POST、$_COOKIE、$_FILES、$_ENV、$_REQUEST、$_SESSION。
局部变量
代码示例:
可以看到在 my_func() 中输出 $my_var 并不能得到“预期”的结果,同样在 my_func() 函数外输出$local_var 也没有结果。那原因是什么呢?
PHP 引擎在执行到调用 my_func() 函数的代码时,执行流程就转到 my_func() 函数内部。此时 PHP 引擎要做的第一件事就是为本次对 my_func() 函数的调用创建一个新的符号表。然后将超级全局变量添加到符号表中,并将这个新的符号表当作当前使用的符号表。
要理解当前符号表,可以举个例子来说明:
你今天要去给大楼的住户抄写水电气的计数,所以你准备了一个本子和一支笔。你先来到一楼,你就在本子上找到一页空白的纸。然后开始挨家挨户的查询计数,并将数据和住户的门牌号一一对应记录下来。
你很快抄完了一楼的数据,来到了二楼。这时候你再次选了一页空白的纸,开始记录二楼住户的水电气计数。而这个过程就和 PHP 引擎执行到一个函数内部时要创建一个新符号表一回事。
在二楼抄写数据时,你不可能同时看到一楼的数据。因为不同楼层的数据是记录在不同的页面上的。当你位于二楼时,记录二楼数据的页面就是你的当前工作页面。在 PHP 引擎来说,执行流程在一个函数内部时,使用的当前符号表就是进入该函数时创建的符号表。
回到我们的代码来。这段代码执行到 $local_var = 123 时,当前使用的符号表(函数内部使
用的符号表)中就会添加一个 $local_var (右表):
接下来执行 echo $local_var 就理所当然的输出了结果。而 echo $my_var 则因为在当前使
用的符号表中找不到名为 $my_var 的变量(这个变量在另一个符号表中),自然不会有输出结果了。
my_func() 函数执行完毕后, PHP 引擎就销毁了当前使用的符号表(也就是执行流程进入
my_func() 函数时创建的那个新符号表)。并将调用 my_func() 函数之前使用的符号表设置为当前
符号表。
接下来的 echo $local_var 代码则因为在符号表中找不到 $local_var 变量而没有输出结果。
要点:每一次函数(包括对象的方法)调用,都会创建一个新的符号表。并且这个新符号表只在函数(方法)内部有效。函数(方法)执行完毕后,这个新建立的符号表就被销毁了。
只要能理解到上面的内容,那么我们就可以很明确的知道在函数(方法)内部定义的变量,是不能在函数(方法)外部被使用的。因为包含这些变量的符号表在函数(方法)执行完毕后就被销毁了。
这些在函数(方法)内部定义的变量都称为局部变量,意思就是局部有效。不过局部变量还有一种特殊的类别,那就是静态变量。本文稍后会对局部静态变量做详细阐述。
除了函数内部定义的变量,函数的参数也会被添加到函数内的符号表中。
函数参数引入的局部变量
文档评论(0)