strlen()不返回false;PHP 8.0+中strlen(null)返回0,旧版触发警告并返回null;未定义变量触发Notice后返回null,配合==可能误判为true;正确做法是先isset()和is_string()校验再调用。

php中strlen()对null或未定义变量返回false?
不是 strlen() 返回 false,而是它对 null、undefined 变量或资源类型(如 resource)抛出警告并返回 null —— 但若错误报告级别关闭(如 error_reporting(0)),配合松散比较(==),可能被误判为 false。
-
strlen(null)实际返回0(PHP 8.0+)或触发E_WARNING并返回null(旧版) -
strlen($undefined_var)触发E_NOTICE,返回null;若用== false判断,null == false为真,造成逻辑错觉 - 常见于从数组取值未校验:
strlen($_POST['name']),当$_POST['name']不存在时出问题
判断字符串长度前必须做的三件事
绕过「看似返回 false」的陷阱,核心是避免传入非法类型。不要依赖 strlen() 自身做类型兜底。
- 先用
isset()或array_key_exists()确认变量存在且非null - 再用
is_string()排除数字、布尔、数组等类型 ——strlen(123)会静默转成字符串再算长度,但通常这不是你想要的 - 最后才调用
strlen();若需兼容空字符串/空白字符,额外加trim()
示例:
$name = $_POST['name'] ?? '';
if (isset($name) && is_string($name)) {
$len = strlen(trim($name));
if ($len > 0 && $len <= 50) {
// 安全使用
}
}
替代方案:mb_strlen() 与空安全写法
处理中文等多字节字符时,strlen() 会返回字节数而非字符数,且对 null 行为同上。更健壮的做法是组合类型检查与多字节支持。
立即学习“PHP免费学习笔记(深入)”;
-
mb_strlen($str, 'UTF-8')仍要求$str是字符串;传null同样返回null或警告 - PHP 8.0+ 可用空合并+类型断言:
$len = mb_strlen($str ?? '', 'UTF-8');,但注意''是安全兜底,不是修复逻辑缺陷 - 真正可靠的写法仍是显式校验:
is_string($str) && $str !== '',再进mb_strlen()
异常值场景下最简防御模式
多数表单或API参数校验不需要复杂封装,几行防御性代码比试图「捕获 strlen 的 false」更直接可靠。
- 拒绝隐式转换:不用
if (strlen($x)),改用if (is_string($x) && strlen($x) > 0) - 统一预处理:对可能为空的输入,强制设默认值,如
$input = $_GET['q'] ?? ''; - 错误报告别关:开发环境保持
error_reporting(E_ALL),让Notice/Warning显形,而不是靠false猜问题
所谓「返回 false」,本质是把类型错误掩盖成了布尔判断失误。盯住变量来源,比调试 strlen 的返回值更有价值。











