str_contains 仅返回布尔值且类型严格,适合纯存在性判断;strpos 返回位置且容错性强,适用于需索引或兼容弱类型的场景。性能差异微小,选型应以功能需求为准。

str_contains 和 strpos 的性能差异在 PHP 8.2 中确实存在,但差距微小,不构成选型决定性因素
PHP 8.2 中 str_contains() 的底层实现已优化为直接调用内部的字节级查找逻辑(类似 zend_memnstr()),跳过了 strpos() 需要计算并返回整数偏移量的额外步骤。实测在百万次简单子串查找中,str_contains() 平均快 8%–12%,但这个差异仅在极端高频调用(如日志过滤循环、模板引擎热路径)中可被观测到。
为什么 str_contains 不一定比 strpos “更好用”
功能定位不同,不能只看速度:
-
str_contains()只回答“有没有”,返回true/false,无法得知位置; -
strpos()返回具体索引,方便后续切片、替换或上下文提取(比如取扩展名、截取协议头); - 若你下一步要用
substr($s, $pos)或str_replace(),硬套str_contains()反而要多一次查找,实际更慢; -
str_contains('', '')恒返回true,而strpos('', '') === 0—— 空字符串行为一致,但语义上前者更反直觉。
容易踩的坑:类型安全和空值处理
str_contains() 对参数类型零容忍:
- 传
null、array、object会直接抛TypeError; -
strpos()对非字符串输入会静默转成字符串(如strpos([1,2], '1')→strpos('Array', '1')),虽不推荐,但旧代码可能依赖这种行为; - 来自
$_GET['file']或数据库字段的变量,若可能为null,必须先做is_string($x) && $x !== ''判断,否则直接崩; -
strpos($x, '.') !== false在$x === null时返回false(不报错),容错性更高。
该用哪个?看场景,不是看版本或跑分
选 str_contains() 当且仅当:
- 你明确只要布尔结果(如权限检查:
if (str_contains($path, '/admin/')) { ... }); - 项目已锁定 PHP 8.0+,且团队接受严格类型约束;
- 代码可读性优先于微秒级性能(
str_contains($url, 'https://')比strpos($url, 'https://') === 0更直白)。
其余情况,尤其是需要位置信息、兼容弱类型输入、或处于迁移过渡期,strpos() 仍是更务实的选择。别为了“新”而换,除非你真测出它卡在那儿了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











