strlen() 本身在 php 7.4 和 8.1 中行为一致,始终按字节计数;差异源于字符串编码不一致、php 8.1 对非字符串参数报错更严格,以及 mb_strlen() 配合使用时的编码配置问题。

strlen() 函数在 PHP 7.4 和 PHP 8.1 中行为本身没有本质变化——它始终只计算字节数,不识别字符边界,也不因版本升级而“自动适配多字节”。所谓“结果不同”,实际是由环境、输入数据或配套函数使用方式差异导致的表象,而非 strlen() 自身逻辑改变。
下面从三个关键角度讲清真正影响结果的因素:
strlen() 本身没变,但字符串内容可能变了
strlen("你好") 在两个版本中都返回 6(UTF-8 下两个汉字各占 3 字节),只要源字符串编码一致、内容相同,结果就完全一样。
常见误判来源:
- 同一变量在不同环境里实际编码不同(如开发机是 UTF-8,测试机存的是 GBK)
- 字符串被意外转码(如
iconv()或mb_convert_encoding()处理后未注意目标编码) - 输入含 BOM、零宽空格等不可见多字节字符,导致字节数增加但肉眼无感
PHP 8.1 对参数类型更严格,错误场景暴露更早
PHP 8.1 开始,strlen() 禁止接收非字符串类型:
- 传数组、null、对象会直接触发
E_DEPRECATED警告(PHP 8.1+),而 PHP 7.4 可能静默转成字符串再计算(如数组转为"Array",长度为 5) - 这会让原本“侥幸运行”的错误代码在 8.1 下立刻报错,让人误以为
strlen行为变了
例如:
strlen(["你好"]); // PHP 7.4 返回 5("Array" 字节数);PHP 8.1 报 Deprecated 警告
真正影响判断的,是和 mb_strlen() 的配合方式
开发者常通过对比 strlen($s) !== mb_strlen($s, 'UTF-8') 判断是否含多字节字符。这个逻辑是否可靠,取决于:
-
mbstring扩展是否启用(8.1 默认仍需手动开启) - 是否显式传
'UTF-8'给mb_strlen()(不传则依赖mb_internal_encoding(),而该值在 CLI 和 Web SAPI 下可能不同) - 输入是否真为 UTF-8 编码(若字符串实为 GBK,
mb_strlen($s, 'UTF-8')可能返回false或错误值)
所以不是 strlen 变了,而是:
- PHP 8.1 更早拦截非法输入,让隐性问题浮出水面
- 多字节判断逻辑对编码一致性要求更高,稍有疏忽就会在新版中表现异常
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











