include变量能否访问只取决于作用域是否连通:必须将include放在函数外使配置变量进入全局作用域,函数内再用global声明;若在函数内include,变量仅为局部,global也无法创建全局变量。

能用,但必须满足“include 所在位置”和“变量定义位置”在同一个作用域里——不是所有写法都管用,尤其别在函数里 include 后直接当全局变量用。
include 时变量能否访问,只看作用域是否连通
PHP 的 include 不是“加载配置”,而是“把代码原样粘贴到当前位置”。它继承的是 include 那一行所在的作用域:
- 如果
include 'config.php'写在函数外(比如文件顶部),那config.php里定义的$db_host就是全局变量,后续任何地方都能用 - 如果
include 'config.php'写在函数内部,那config.php里的$db_host = '127.0.0.1'就只是这个函数的局部变量,函数外完全不可见 - 此时你在函数里写
global $db_host没用:它只能让函数“引用已存在的全局变量”,但全局根本没这个变量
常见错误:函数内 include 后直接 echo 变量报 Notice
典型现象是:Notice: Undefined variable: db_host。代码长这样:
function connect() {
include 'config.php'; // config.php 里有 $db_host = '127.0.0.1';
echo $db_host; // ❌ 报错
}
原因很直接:config.php 被包含进了 connect() 的作用域,$db_host 是局部变量;而 echo 那行没声明 global $db_host,自然找不到。
立即学习“PHP免费学习笔记(深入)”;
但就算你补上 global $db_host,也救不回来——因为全局作用域里压根没定义过 $db_host,global 只是建立引用,不是创建变量。
想让 config.php 的变量变成全局,就别把它塞进函数里
正确姿势只有一种:把 include 放到所有函数之外,让它自然进入全局作用域。之后函数里要用,再配合 global 声明:
// config.php
$db_host = '127.0.0.1';
$db_name = 'test';
// main.php
include 'config.php'; // ✅ 在最外层
function connect() {
global $db_host, $db_name; // ✅ 此时 global 才有意义
return new PDO("mysql:host=$db_host;dbname=$db_name", $user, $pass);
}
注意:global 必须写在函数内、使用变量之前;且前提是全局作用域里真有这个变量——否则还是空的。
替代方案:用 return 数组或 const 避开作用域陷阱
如果非得在函数里动态加载配置(比如多环境切换),别依赖变量作用域,改用显式返回:
- 让
config.phpreturn ['host' => '127.0.0.1', 'name' => 'test']; - 函数里
$cfg = include 'config.php';,然后用$cfg['host'] - 或者全用
define()或const定义常量,它们天生全局可见,不受include位置影响
真正容易被忽略的点是:include 的作用域规则和 require 完全一致,但很多人误以为换用 require 就能绕过作用域限制——不能。作用域和加载失败处理是两回事。



















