php8.1新增str_contains、str_starts_with、str_ends_with:均严格要求字符串参数,返回bool;空串恒为true;区分大小写;不支持数组/null/正则;彻底替代strpos等易错写法。

整理PHP8.1新增字符串函数笔记,需聚焦str_contains、str_starts_with、str_ends_with三个核心函数的用法差异、参数要求、返回值类型及典型误用场景,避免混入PHP8.0或更早版本已存在的函数。
确认PHP版本并验证函数可用性
在终端执行 php -v,确保输出包含 8.1.x 或更高版本号;若为8.0.x或更低,str_contains等函数将直接报错“undefined function”。
新建一个test.php文件,写入 <?php var_dump(function_exists('str_contains')); 并运行,返回 bool(true) 才可继续下一步。
str_contains:判断子串是否存在
方法一:基础用法
直接传入主字符串和待查子串,返回布尔值:str_contains('apple pie', 'pie') → true。
方法二:注意空字符串陷阱
【空子串始终返回true】:str_contains('hello', '') 返回 true,这与 strpos('', '') !== false 的行为一致,但容易被忽略导致逻辑错误。
方法三:不支持数组自动展开
传入数组如 str_contains(['a','b'], 'a') 会触发致命错误:Argument #1 ($haystack) must be of type string,必须先用 implode 或循环处理。
str_starts_with 和 str_ends_with:前缀/后缀精准匹配
第一步:确认大小写敏感性
这两个函数严格区分大小写,str_starts_with('Hello', 'hello') 返回 false;如需忽略大小写,必须先统一转小写:str_starts_with(strtolower($s), strtolower($prefix))。
第二步:空字符串作为前缀/后缀的含义
【空字符串前缀恒为true】:str_starts_with('world', '') 返回 true,这是设计使然,不是bug。
第三步:拒绝null和非字符串类型
传入 null、0、[] 等非字符串值会抛出 TypeError,必须提前用 is_string() 校验。
对比旧函数:为什么不再用 strpos + !== false
用 strpos($s, $needle) !== false 判断存在性时,若 $needle 出现在位置 0(如 strpos('abc', 'a') === 0),易被误判为 false;而 str_contains 直接返回布尔值,彻底规避该风险。
str_starts_with 内部已做边界检查,无需像 substr($s, 0, strlen($prefix)) === $prefix 那样手动截取比对,代码更短、语义更清晰。
所有三个新函数均不支持正则、不接受选项参数、不进行编码转换——它们只做一件事:精确、快速、无副作用的字符串包含/起始/结束判断。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











