global 并不是真正的声明全局变量(这一点一定要明确!), 使用 global 关键字是对全局区域变量的 作用域进行扩展。使其在 有 global 声明的作用域中有效, 如果 global修饰并赋值(不初始化该变量就不存在)变量 在全局区域不存在,编译器会在全局区域创建一个同名变量。这就是为什么 函数内 global 修饰并赋值的变量,在全局区域内也可以访问但反过来就不行的原因。
为了更深入理解,写了个稍微复杂点的例子。
a.php:
function TestA() { global $aa; $aa = "exist"; print "<br/> [a.TestA()]:" .$aa ."<br/>";
} function TestA2() { global $aa; print "<br/> [a.TestA2()]:" .$aa ."<br/>";
} print "<br/> [a]:" .$aa ."<br/>";
|
b.php:
function TestB() { include 'a.php'; TestA(); print "<br/> [b.TestB()]:" .$aa ."<br/>"; }
TestB(); TestA2(); print "<br/> [b]:" .$aa ."<br/>";
|
输出:
[a]: [a.TestA()]:exist [b.TestB()]: [a.TestA2()]:exist [b]:exist
|
结论:
- 即便是导入其他文件也只会存在一个通用(a.php 和 b.php 都可以访问)的全局区域。
- global修饰并赋值的变量,如果全局区域不存在, 编译器会在全局区域创建一个同名的变量。而不是其父级区域。
。。