php 8.0 引入了 str_contains()、str_starts_with() 和 str_ends_with() 三个字符串函数,用于替代原有的 strpos() 或 substr() 组合判断。调用时直接传入被搜索的字符串作为第一个参数,目标子串作为第二个参数即可返回布尔值。这三个函数在遇到空字符串或 null 输入时会抛出异常,因此使用前需确保输入有效。

str_contains() 如何替代 strpos() 进行子串匹配
str_contains() 专门用于检测一个字符串是否包含另一个子串,它直接返回布尔值,无需像 strpos() 那样处理 0 值的歧义。该函数区分大小写,若只需不区分大小写的匹配,应使用 stripos() 配合逻辑判断或改用 mb_strpos()。当主串为空但子串非空时,函数会正确返回 false;若子串为空,则始终返回 true。

<?php
// 示例:检查文件名是否包含特定后缀
$filename = "report.pdf";
if (str_contains($filename, ".pdf")) {
echo "是 PDF 文件\n";
}
// 对比旧写法
if (strpos($filename, ".pdf") !== false) {
echo "是 PDF 文件 (旧写法)\n";
}
// 错误处理:子串为 null 会报错
try {
str_contains("test", null);
} catch (TypeError $e) {
echo "捕获异常: " . $e->getMessage() . "\n";
}
?>
str_starts_with() 与 str_ends_with() 的前缀后缀判断
str_starts_with() 和 str_ends_with() 分别用于判断字符串是否以指定前缀或后缀开头或结尾。这两个函数同样区分大小写,且要求两个参数都必须是字符串类型。它们比使用 substr() 截取后比较更直观且性能略优,因为内部实现避免了额外的内存分配。如果前缀或后缀长度超过主串长度,函数会返回 false。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;

<?php
$url = "https://example.com/path";
// 检查是否以 https 开头
if (str_starts_with($url, "https://")) {
echo "安全连接\n";
}
// 检查是否以 /path 结尾
if (str_ends_with($url, "/path")) {
echo "路径匹配\n";
}
// 边界情况:前缀长于字符串
var_dump(str_starts_with("hi", "hello")); // bool(false)
?>
当输入包含 null 值时这三个函数会抛出什么异常
在 PHP 8 中,这三个函数对参数类型检查非常严格。如果传入的第一个参数(主串)或第二个参数(子串/前缀/后缀)为 null,函数不会静默失败或返回 false,而是直接抛出 TypeError 异常。这意味着在不确定输入是否为 null 时,必须先进行类型检查或使用默认值填充,否则会导致脚本中断。这种设计强制开发者显式处理空值,提高了代码的健壮性。


















