php 8 新增 str_contains()、str_starts_with() 和 str_ends_with() 三个直观字符串判断函数,替代易错的 strpos() 写法,大小写敏感、空串返回 true、参数类型严格,低版本可用 polyfill 或传统函数模拟。

PHP 8 引入了 str_contains()、str_starts_with() 和 str_ends_with() 这三个轻量又直观的字符串判断函数,彻底替代了过去容易出错的 strpos() 冗长写法。它们不依赖正则,不返回位置索引,只专注回答“有没有”“是不是开头”“是不是结尾”——逻辑清晰、代码干净、新人也能一眼看懂。
str_contains():判断是否包含子串
检查一个字符串里有没有某个子串,直接传两个字符串就行:
-
基本用法:
str_contains('hello world', 'world')→true -
大小写敏感:
str_contains('Hello', 'hello')→false -
空字符串是特例:
str_contains('abc', '')→true(任何非 null 字符串都“包含”空串) -
类型严格:传数组、null 或对象会抛
TypeError,必须确保参数是字符串
安全使用 str_contains() 的实用技巧
实际项目中,文件名、URL、表单输入等变量往往不可信,直接调用可能报错或产生警告:
- 推荐封装容错逻辑:
is_string($input) ? str_contains($input, '.') : false - 避免警告:若 $input 是 null,
str_contains(null, '.')会触发 Warning 并返回 false,但不该依赖这种行为 - 判断文件名是否含点号(如扩展名):
str_contains($filename, '.') && $filename !== ''更稳妥 - WordPress 5.9+ 用户可放心用:即使 PHP 版本低于 8.0,它已内置 polyfill 兼容
str_starts_with() 和 str_ends_with()
这两个函数和 str_contains() 是一套,用法一致,语义更明确:
-
str_starts_with('https://example.com', 'https://')→true -
str_ends_with('/path/to/file.jpg', '.jpg')→true - 同样大小写敏感,同样对空字符串返回 true(
str_starts_with('abc', '') === true) - 同样要求参数为字符串,否则 TypeError;低版本可用 WordPress polyfill 或手动实现
兼容旧版 PHP 的替代方案
如果你还不能升级到 PHP 8.0,这几个经典写法依然可靠:
- 代替
str_contains():strpos($haystack, $needle) !== false(注意必须用!== false,不能用== false) - 代替
str_starts_with():substr($haystack, 0, strlen($needle)) === $needle或0 === strpos($haystack, $needle) - 代替
str_ends_with():strrpos($haystack, $needle) === strlen($haystack) - strlen($needle) - 忽略大小写的场景,统一换用
stripos()、stristr()等对应函数
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











