str_starts_with 是 PHP 8.0 引入的原生函数,用于判断字符串是否以指定子串开头,语义更清晰、安全性更高、性能略优,且自动处理空字符串、null 等边界情况;低于 PHP 8.0 需用兼容 polyfill。

str_starts_with 是 PHP 8.0 引入的原生函数,专用于判断字符串是否以指定子串开头,比用 strpos($str, $prefix) === 0 更简洁、语义更清晰、性能略优,且天然避免空字符串或 false/0 类型混淆问题。
语义更明确,代码可读性高
用 strpos 判断开头需手动检查返回值是否为 0(注意是全等,不能用 ==),容易写成 strpos($str, $prefix) === false(这是判断“不包含”,逻辑反了)或漏掉严格比较导致 'abc' 被误判为以 'a' 开头(实际没错),但一旦 $prefix 为空,strpos 返回 0,可能被误认为“匹配成功”——而空前缀在 str_starts_with 中明确定义为 true(符合预期)。
替代写法对比:
// 旧方式(易错)
if (strpos($str, 'https://') === 0) { ... }
// 新方式(一目了然)
if (str_starts_with($str, 'https://')) { ... }
自动处理边界情况,无需额外判断
str_starts_with 内部已处理以下常见边界:
立即学习“PHP免费学习笔记(深入)”;
- 当
$string或$prefix为 null 时,会自动转为字符串(null→''),不会警告; - 当
$prefix长度超过$string时,直接返回 false(无需 strlen 比较); - 空字符串前缀
''总是返回 true(数学上任何字符串都以空串开头)。
而 strpos 方式需自行防御:if ($prefix !== '' && strpos($str, $prefix) === 0) —— 多余且易遗漏。
性能略优,尤其对长字符串
str_starts_with 是 C 层实现的专用函数,内部只比对前 N 个字符(N = prefix 长度),一旦发现不匹配立即返回 false;
strpos 则可能扫描整个字符串(尤其当前缀不存在时),最坏时间复杂度 O(n),而 str_starts_with 最坏仅 O(m),m 为前缀长度。
实际项目中差异微小,但语义 + 安全 + 性能三者兼得,没有理由不用。
兼容性提醒:低于 PHP 8.0 需 polyfill
若项目还需支持 PHP 7.x,可手动定义 fallback:
if (!function_exists('str_starts_with')) {
function str_starts_with(string $haystack, string $needle): bool {
if ($needle === '') return true;
$len = strlen($needle);
return strlen($haystack) >= $len && substr($haystack, 0, $len) === $needle;
}
}
注意:不要用 strpos 实现 polyfill,否则失去类型安全和空字符串语义优势。



















