PHP中未初始化变量的值为null,但访问会触发E_NOTICE;null是未定义状态的统一表示,非设计默认值,不可依赖,函数参数默认值仅在完全省略时生效。

PHP变量本身没有“全局默认值”概念,未初始化的变量值为 null,但这不是可依赖的默认行为——它只是语言在变量未声明时的底层表现,且会触发 E_NOTICE。
未初始化变量的值就是 null
PHP中,一个从未赋值、也未声明的变量(比如直接写 $x 而没给它任何值),其值被当作 null。这不是设计出来的“默认值”,而是语言对未定义状态的统一表示:
-
var_dump($undefinedVar);输出NULL - 但访问它会抛出
Notice: Undefined variable - 这种
null不可被类型系统识别为合法值:例如函数参数声明string $s,传入未定义变量会导致致命错误,而非静默转成空字符串
函数参数默认值只在“完全省略参数”时生效
函数签名里写的 $name = 'guest' 仅当调用时**根本不传这个参数**才起作用:
-
greet();→$name是'guest' -
greet(null);→$name是null,不是'guest' -
greet('');→$name是空字符串,不是'guest' -
greet($undefined);→ 先报Undefined variable,根本进不了函数体
数组键取值必须用 ??,不能靠变量默认值
数组元素不存在时,$arr['missing'] 不是“自动为 null”,而是触发 Notice;想安全兜底,必须显式用空合并操作符:
立即学习“PHP免费学习笔记(深入)”;
-
$name = $user['name'] ?? 'anonymous';—— 正确,覆盖未定义和null -
$name = $user['name'] ?: 'anonymous';—— 错误,0、false、''都会被当成“空”而替换 - 别用
@$user['name']抑制错误,掩盖问题且影响性能
类属性默认值只能是静态表达式
类中声明属性时写 public $msg = 'hello'; 是允许的,但以下都不行:
-
public $now = date('Y-m-d');—— 函数调用,解析期报错 -
public $cfg = $_ENV['APP_ENV'];—— 超全局变量非编译时常量 -
public $data = []; // PHP 5.6+可以,老版本得用array()
真正需要“默认值”的地方,几乎都要靠运行时判断:用 ?string 声明参数可为空,再用 $x ?? 'fallback' 或 trim($x) ?: 'fallback' 在函数体内做兜底——语言不替你做语义判断,这点最容易被忽略。



















