引子:
有文件1.php:
- <?php
- $conf = array("hello world");
- ?>
文件2.php
- <?php
- include_once("1.php");
- function do_sth() {
- global $conf;
- print_r($conf);
- }
- ?>
文件3.php
- <?php
- include_once("2.php");
- do_sth(); // 这里能不能打印出数组内容取决于3.php的上下文环境
- ?>
直接执行 3.php 可以打印出数组内容。
下面使用文件4.php来include文件3.php
文件4.php
- <?php
- wrap(); // 这里不能打印出$conf数组的内容
- function wrap() {
- include_once("3.php");
- }
- ?>
分析:
1) 因为1.php 中的$conf数组没有使用global声明,所以1.php中 $conf数组的作用于取决于 1.php的上下文环境;
2) 3.php 直接执行的话,工作的很好,但是一旦被一个函数给包裹住,则$conf 数组不再是一个全局变量,这样do_str() 也就不能按照预期执行了
3) 如果在1.php中也使用global声明一下 $conf , 然后再赋值,就比较靠谱了
结论:
1. 不要指望在任何函数外部声明的变量就是全局的
2. 虽然使用global 声明后同样可以确保是一个全局变量,但是这里还是建议使用 $GLOBALS 数组来访问全局变量