在函数内 include 文件,该文件中的全局变量在函数内部用 global 声明却无法生效。
b.php:
<?php
$site_name = 'CodePlayer';
function sayHi() {
global $site_name;
echo "Hello! Welcome to $site_name !";
}
?>
a.php:
<?php
function include_view_page() {
include 'b.php';
sayHi();
}
include_view_page();
?>
输出:Hello! Welcome to !($site_name 为空)
include 在函数 include_view_page() 内部执行,导致 b.php 的顶层代码运行在该函数的**局部作用域**中。此时 $site_name 成为 include_view_page() 的局部变量,而非脚本全局变量。随后 sayHi() 中的 global $site_name 试图引用脚本全局作用域的 $site_name(即 $GLOBALS['site_name']),但该变量从未定义,故为空。
b.php 修正:
<?php
global $site_name; // 关键:声明为全局变量
$site_name = 'CodePlayer';
function sayHi() {
global $site_name;
echo "Hello! Welcome to $site_name !";
}
?>
这样 $site_name 在脚本全局作用域创建,sayHi() 的 global 引用即可生效。
b.php:
<?php
$GLOBALS['site_name'] = 'CodePlayer'; // 显式写入全局符号表
function sayHi() {
echo "Hello! Welcome to {$GLOBALS['site_name']} !";
}
?>
不依赖 global 关键字,直接操作全局符号表,最彻底。
require_once。<?php
$var1 = "#####";
$var2 = "&&&&&";
function global_references($use_globals) {
global $var1, $var2;
if (!$use_globals) {
$var2 =& $var1; // 1:仅函数内建立引用,$var2 指向 $var1 的值
} else {
$GLOBALS["var2"] =& $var1; // 2:在全局符号表建立引用,影响全局 $var2
}
}
global_references(false);
echo "var2 is set to '$var2'
"; // 输出 &&&&&(全局 $var2 未变)
global_references(true);
echo "var2 is set to '$var2'
"; // 输出 #####(全局 $var2 已指向 $var1)
?>
结论:函数内 $var2 =& $var1 仅影响函数内部别名;$GLOBALS['var2'] =& $var1 才修改全局绑定。
global $var。$GLOBALS['name'],语义明确、不受作用域限制。include/require 含业务逻辑的文件,改用自动加载器加载类文件。