全局变量需用global声明才能在函数内访问,否则为独立局部变量;static变量保留在函数内但不污染全局;类成员访问控制与作用域无关;include直接嵌入代码影响当前作用域。

全局作用域里直接写 $var 和用 global 声明的区别
函数内部读不到外面定义的变量,这是最常踩的坑。不是“没声明”,而是 PHP 默认把函数当独立空间,$var 在函数里是全新变量,和外面同名的毫无关系。
想在函数里改全局变量,得显式告诉 PHP:“我要用外面那个”——用 global 声明:
$counter = 1;
function inc() {
global $counter;
$counter++;
}
inc();
echo $counter; // 输出 2
不加 global,$counter++ 只会操作函数内未初始化的局部 $counter,原值不变,还可能报 Notice: Undefined variable。
-
global是引用绑定,改它等于改全局变量本身 - 多个变量用逗号分隔:
global $a, $b, $c; - 在函数里用
$GLOBALS['var']也能达到同样效果,但可读性差、易拼错键名
静态变量 static 不是“全局”,而是“函数专属记忆体”
函数调用完,局部变量就销毁;但加了 static 的变量,值会保留到下次调用——它既不随函数退出消失,也不污染全局命名空间。
立即学习“PHP免费学习笔记(深入)”;
典型场景:计数器、缓存首次计算结果、避免重复初始化资源:
function get_db_connection() {
static $conn = null;
if ($conn === null) {
$conn = new PDO('sqlite::memory:');
}
return $conn;
}
-
static变量只在第一次执行到该行时初始化,之后跳过 - 不能用表达式初始化(如
static $x = time();会报错),只能用字面量或 const - 它和全局变量完全隔离,外部无法通过
$GLOBALS或global访问
类里的 public/protected/private 和函数作用域无关
别被“作用域”这个词带偏。类成员的访问控制(public、protected、private)管的是“谁可以读写这个属性或方法”,不是“变量在哪能被看到”。它们和函数级作用域(local/global/static)属于不同维度。
比如 private $data 在类方法里可以直接用 $this->data,这不是因为“作用域穿透”,而是 PHP 对象模型的设计规则;换成普通函数,$this 根本不存在,private 属性也根本不可见。
- 类方法内部访问自身属性,走的是对象属性查找逻辑,不触发函数作用域规则
- 在类外试图读
$obj->privateProp,报错是Fatal error: Cannot access private property,不是变量未定义 - 闭包里用
use引入变量,才是真正的“作用域捕获”,和global或static都不等价
include/require 文件里的变量默认进入当前作用域
很多人以为 include 'config.php' 是“导入模块”,其实它只是把文件内容原样塞进当前执行位置。如果 config.php 里写了 $host = 'localhost';,那它就在当前作用域变成一个局部或全局变量——取决于你当前在哪执行 include。
在函数里 include,$host 就是函数局部变量;在全局作用域 include,它就是全局变量。
- 这容易造成意外污染,尤其多人协作时,别人 include 的文件可能悄悄覆盖你的变量
- 更安全的做法:让被 include 文件返回数组或配置对象,而不是裸变量
-
include_once和require_once防重复加载,但不解决作用域污染问题
include 有封装性。写的时候多问一句:“这个变量此刻到底在哪个符号表里?”











