函数内用$var=...声明的变量默认为局部变量,仅在函数执行期间存在,返回后自动销毁;static变量只初始化一次并保留上次值;global和$globals可修改全局变量但易引发混乱;闭包需use显式捕获外部变量。

函数内定义的变量默认就是局部变量
PHP 函数里用 $var = ... 声明的变量,只要没加 global 或 static,就只在函数执行期间存在,函数返回后自动销毁。这不是约定,是语言行为。
常见错误现象:Notice: Undefined variable 出现在函数外试图读取函数内定义的变量时;或者误以为循环里的 $i 能在函数末尾被 echo 出来。
- 局部变量不继承外部同名变量——哪怕外面有
$name = 'a',函数里再写$name = 'b'也完全无关 - 参数本身也是局部变量,修改它不会影响调用处的原始值(除非传的是引用
&$param) - 嵌套函数(如闭包)中,要用
use ($var)显式捕获外部变量,否则访问不到
想在函数里改全局变量?别直接赋值
直接在函数里写 $GLOBALS['count']++ 或 global $count 是能用,但容易引发状态混乱。更安全的做法是把需要变更的数据作为参数传入、处理后再返回。
使用场景:计数器、配置开关、调试标记等需跨函数共享的小状态。
立即学习“PHP免费学习笔记(深入)”;
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
-
global $config会让函数强依赖全局作用域,单元测试难 mock -
$GLOBALS数组操作虽灵活,但键名拼错会静默失败(比如写成$GLOBALS['confg']) - 如果真要共享状态,优先考虑类属性或依赖注入,而不是裸 global
局部变量和 static 变量的区别在哪
static 不是“静态变量”,而是“保留上次执行值的局部变量”。它只初始化一次,后续调用时跳过声明,直接用上回留下的值。
性能影响:比普通局部变量多一点内存占用(生命周期延长),但远轻于全局变量或对象持久化。
- 错误用法:在递归函数里用
static $i = 0; $i++期望每次递归独立计数——实际所有递归层级共用一个$i - 正确用法:
static $cache = [];缓存计算结果,避免重复查数据库或解析 JSON - 兼容性:PHP 5.6+ 支持
static $arr = [];这种数组初始化,老版本只能写static $arr; if ($arr === null) $arr = [];
闭包里怎么安全用外部变量
匿名函数默认看不到父作用域变量,必须用 use 明确列出。漏写、拼错、或忘记加 & 都会导致行为不符合预期。
常见错误现象:回调执行后外部变量没变;或者 use ($x) 后改 $x,闭包里还是旧值。
-
use ($x)是值传递,闭包内改$x不影响外部;use (&$x)才是引用传递 -
use不能访问$this(除非是function () use ($this),但 PHP 不允许这样写;得用use ($self = $this)曲线救国) - 多个变量用逗号分隔:
use ($a, &$b, $c),注意&只作用于紧邻的变量
use、static、global 混用时,边界很容易模糊。最常被忽略的是:函数返回后,局部变量不仅“不可见”,而且内存已释放——别指望 var_dump 它还能看到什么。










