PHP变量名必须以$开头且区分大小写,不能以数字开头;弱类型导致赋值决定类型,需用gettype()确认;全局变量需global或参数传入;unset()销毁绑定而非值,引用变量需注意作用域与内存一致性。

PHP变量名必须以美元符开头,且区分大小写
PHP中所有变量都以 $ 开头,这是硬性语法要求,漏掉会直接报 Parse error: syntax error。变量名本身不能以数字开头,但可以包含字母、下划线和数字,比如 $user_name 合法,$1user 非法。
大小写敏感这点容易被忽略: $count 和 $Count 是两个完全不同的变量。在函数作用域、类属性或全局上下文中混用大小写,常导致“变量未定义”或值为空的隐性错误。
常见误操作:
- 忘记写
$,例如把echo $name写成echo name→ 输出字符串 "name" 而非变量值 - 在双引号字符串里误写成
"Hello $Name"(大写),而实际定义的是$name→ 输出Hello(空) - 用短标签
= $var ?>时,变量名后多加了空格,如= $var ?>写成= $var ?>(看似一样,实则可能因编辑器不可见字符出错)
PHP变量无需声明类型,但赋值决定其数据类型
PHP是弱类型语言,$x = 5 是整型,$x = "5" 就变成字符串,$x = null 后再 echo $x 什么也不输出。这种动态性方便快速开发,但也带来隐患:比如数据库查出的 id 是字符串 "123",后续用 === 严格比较 123 会失败。
立即学习“PHP免费学习笔记(深入)”;
关键点:
- 使用
gettype($var)或var_dump($var)查看真实类型,别只靠echo判断 - 涉及数值计算前,建议显式转换:
(int)$str_id或filter_var($str_id, FILTER_VALIDATE_INT) -
empty()对0、"0"、null、false都返回true,判断字符串是否为空应优先用strlen($str) === 0或$str === ""
PHP变量作用域影响访问范围,全局变量需显式声明
函数内无法直接读写外部定义的变量,哪怕名字一样。比如在函数外有 $config = ['host' => 'localhost'],函数里直接 echo $config['host'] 会报 Undefined variable。
解决方式只有三种:
- 用
global $config声明(不推荐,破坏封装) - 通过参数传入:
function connect($cfg) { ... } - 用
$GLOBALS['config']访问(更隐蔽,调试困难)
闭包中使用外部变量需用 use 关键字:$fn = function() use ($config) { return $config['host']; };。漏掉 use 就拿不到值,而且 use 默认按值传递,要修改原变量得写 use (&$config)。
unset() 和变量引用会影响内存与行为一致性
unset($var) 并非清空变量,而是销毁该变量名与对应值的绑定。如果多个变量引用同一块内存(通过 & 引用赋值),unset 其中一个不会影响其他引用。
示例:
$a = [1, 2, 3]; $b = &$a; unset($a); var_dump($b); // 还是 array(1, 2, 3),没被删
真正容易出问题的是循环中引用+unset组合:
- 对数组用
foreach ($arr as &$item)后,没unset($item),下次循环可能意外修改上一轮的引用 - 在对象属性上做引用,然后
unset属性,对象本身不受影响,但后续访问该属性会触发 Notice
引用不是指针,没有地址概念;它只是让两个变量名指向同一存储位置——这点理解偏差,是很多“值变了但没改”的问题根源。



















