strlen() 和 mb_strlen() 均返回 int 类型,但 strlen() 返回字节长度,mb_strlen() 返回字符数,处理中文等多字节字符串时语义不同,混用会导致逻辑错误。

strlen() 返回的是 int 类型,不是 string
PHP 的 strlen() 函数明确返回整数(int),表示字节长度。它不会返回字符串、null 或布尔值——哪怕输入是空字符串或 false,也照常返回 int。
常见误判场景:
- 传入
null:PHP 8+ 会抛出TypeError;PHP 7.x 会静默转成空字符串,返回0 - 传入数组:直接报
Warning: strlen() expects parameter 1 to be string, array given - 传入对象且未实现
__toString():同数组,类型错误
安全写法示例:
if (is_string($str)) {
$len = strlen($str);
} else {
$len = 0;
}
mb_strlen() 的返回值也是 int,但需注意字符编码参数
mb_strlen() 同样返回 int,但它按字符数(而非字节数)计算,适用于中文等多字节字符串。关键点在于第三个参数 $encoding:
立即学习“PHP免费学习笔记(深入)”;
- 不传或传
null:使用mb_internal_encoding()当前值,可能和实际编码不一致 - 显式传
'UTF-8'最稳妥,尤其处理 JSON、API 返回内容时 - 若编码指定错误(比如用
'ISO-8859-1'解 UTF-8 字符串),可能返回0或异常小的值
示例:
// 安全调用 $len = mb_strlen($str, 'UTF-8');
为什么 var_dump(strlen("a")) 显示 int(1),但 echo gettype(strlen("a")) 是 "integer"
这其实是 PHP 类型系统的自然表现:strlen() 的返回值本身就是 int,所有类型检查函数(gettype()、is_int())都会如实返回结果。容易混淆的点在于:
-
echo会自动把int转成字符串输出,看起来像“返回字符串”,其实只是隐式转换 -
var_dump()显示int(1)是标准行为,括号里是值,前面是类型名 - 函数声明中(PHP 7.0+)可加返回类型提示:
function safe_strlen(string $s): int { return strlen($s); }
别把 strlen() 和 mb_strlen() 混着用还期望返回值类型一致
两者都返回 int,但语义不同,混用会导致逻辑错误——类型一致不等于含义一致:
- 英文/ASCII 字符串:两者结果通常相同
- 中文字符串(UTF-8):
strlen("你好")返回6(3个字符 × 2字节),mb_strlen("你好", 'UTF-8')返回2 - 如果用
strlen()做截断判断(如限制显示 10 个字符),中文会严重超限
真正要检查“是否超过 10 个可见字符”,必须用 mb_strlen($s, 'UTF-8') > 10,而不是 strlen()。
最易被忽略的是:很多老项目默认用 strlen() 处理用户昵称、评论,上线后遇到中文就出界、截断乱码,问题根源不在返回类型,而在语义误用。











