PHP变量未声明global却在其他文件可见的原因探究
问题分析与解答
代码示例
0.php
<?php $v='good'; echo 'In file: '.__FILE__." v={$v}<br>\n"; ?>
1.php
<?php require '0.php'; echo 'In file: '.__FILE__." v={$v}<br>\n"; ?>
2.php
<?php require '1.php'; echo 'In file: '.__FILE__." v={$v}<br>\n"; ?>
运行输出
In file: /xxx/httpdocs/0.php v=good In file: /xxx/httpdocs/1.php v=good In file: /xxx/httpdocs/2.php v=good
原因解释
你对global关键字的作用理解有误:
global是用来在函数内部访问全局作用域中的变量,而非让变量跨文件可见。- PHP的
require/include本质是把被包含文件的代码原封不动插入到当前文件的执行位置,相当于所有代码都在同一个全局作用域下运行。所以0.php中定义的$v属于全局变量,在1.php、2.php的全局作用域中自然可以直接访问,不需要额外声明global。
举个反例就能更清楚:如果在函数内部包含文件,变量作用域就会局限在函数内:
<?php function test() { require '0.php'; echo $v; // 这里能正常输出,因为0.php的代码被插入到函数内部,$v是函数局部变量 } test(); echo $v; // 这里会报错,因为函数内的$v不属于全局作用域 ?>
总结来说,require不会创建新的作用域,只是代码拼接操作,全局作用域下的变量自然在拼接后的整个代码流程中有效。
内容的提问来源于stack exchange,提问作者George Kourtis
相关产品推荐
相关产品推荐

