PHP 7.3 中字符串“空值”需区分 null、""、"0"、0、false 五种情况;is_null仅判null,empty将五者全视为空,isset容许""和"0",=== ""严格匹配空字符串,??/??=不将"0"误判为空。

PHP 7.3 中字符串空值问题常被误判为“空”,实际却可能是 ""、"0"、0、false 或 null,它们在不同判断方式下行为差异大。排查关键不是笼统说“是不是空”,而是明确:你关心的是“未定义”、“真实为空”还是“逻辑上应跳过”。
先分清四种常见“空”的本质
同一字符串变量,在不同函数下结果可能完全相反:
-
is_null($str):只对null返回 true;""、"0"、0全是 false -
empty($str):把""、0、"0"、false、null都当空 —— 这是最容易踩坑的点 -
isset($str):只要变量已声明且不为null就返回 true;""和"0"都通过 -
$str === "":严格比对是否等于空字符串,不转类型,"0"、0、null全不匹配
用 ?? 和 ??= 快速兜底未定义或 null 场景
如果问题出在变量根本没定义或被设成 null(比如配置读取失败、API 返回缺失字段),直接用空合并操作符最安全:
-
$name = $_GET['name'] ?? '游客';→ 只有$_GET['name']是null或未定义时才用默认值 -
$config['timeout'] ??= 30;→ 仅当$config['timeout']为null或未设置时赋值,"0"或0都保留原值 - 注意:
??和??=不会把"0"当空,这点和||或empty()有本质区别
检查字符串内容本身是否真为空或含伪装值
当变量已存在,但业务逻辑异常(比如用户名显示为空、ID 处理失败),需进一步看值的内容:
立即学习“PHP免费学习笔记(深入)”;
- 用
var_dump($str)查类型和原始值,别只用echo——"0"和0输出一样,但类型不同 - 用
trim($str) === ""判断是否纯空白(含空格、换行等) - 若来自表单或 API,检查是否被前端 JS 清空后仍提交了
"0"或"false"字符串 - 上传文件名、路径拼接等场景,警惕
"\0"截断或 UTF-8 BOM 导致的不可见字符
结合调试快速定位来源环节
不要只在使用处加判断,要顺藤摸瓜找源头:
- 如果是数组元素(如
$data['title']),先确认$data是否为数组:is_array($data),再查键是否存在:array_key_exists('title', $data) - 若来自数据库,检查字段是否允许 NULL、是否用了
COALESCE或IFNULL - 若经 JSON 解析,注意
json_decode默认返回对象,访问属性要用->;要数组得加第二个参数true,否则$obj->title对 null 字段会静默失败 - 开启
error_reporting(E_ALL),让未定义索引、null 转字符串等隐性错误暴露出来



















