str_ends_with() 是 PHP 8.0 引入的二进制安全字符串函数,用于判断字符串是否以指定子串结尾,支持单字符串或数组后缀、大小写敏感、不自动类型转换,且空字符串恒为 true。

str_ends_with() 是 PHP 8.0 引入的原生字符串函数,用于简洁、安全地判断字符串是否以指定子串结尾。它替代了过去需手动用 substr() + strlen() 或正则表达式实现的写法,语义清晰、性能更好,且对二进制安全(即支持任意字节序列,包括 null 字节)。
✅ 基本用法与返回值
该函数接收两个参数:主字符串和待匹配的后缀,返回布尔值:
bool str_ends_with(string $haystack, string|array $needles)
-
$haystack:要检查的原始字符串; -
$needles:可以是单个字符串,也支持传入字符串数组(任一匹配即返回true); - 区分大小写(如需忽略大小写,请用
str_ends_with(strtolower($s), strtolower($suffix))); - 不会进行类型转换,若传入非字符串类型(如
null、int),会触发TypeError(PHP 8+ 类型严格性体现)。
? 实测可用示例(PHP 8.0+ 环境验证通过)
var_dump(str_ends_with("hello world", "world")); // true
var_dump(str_ends_with("hello world", "World")); // false(大小写敏感)
var_dump(str_ends_with("image.png", [".jpg", ".png"])); // true(数组任一匹配)
var_dump(str_ends_with("test", "")); // true(空字符串视为任何字符串的后缀)
var_dump(str_ends_with("", "")); // true
var_dump(str_ends_with("abc", "abcd")); // false(后缀不能比主串长)⚠️ 注意事项与常见坑点
-
不兼容低版本:PHP < 8.0 无此函数,直接调用会报
Fatal error: Uncaught Error: Call to undefined function str_ends_with();可加运行时检测或使用 polyfill:if (!function_exists('str_ends_with')) { function str_ends_with(string $haystack, string|array $needles): bool { if (is_string($needles)) { return '' === $needles || ($len = strlen($needles)) <= strlen($haystack) && substr($haystack, -$len) === $needles; } foreach ($needles as $needle) { if (str_ends_with($haystack, $needle)) return true; } return false; } } - 不处理多字节字符边界问题:该函数是字节级操作,不是 UTF-8 意义上的“字符”匹配。对含 emoji 或中文等多字节字符的字符串,只要字节序列匹配就成立,一般不影响日常使用,但需知其本质;
-
空后缀永远为 true:这是设计行为(符合 POSIX
endswith语义),不是 bug; -
性能优势明显:相比
substr($s, -strlen($t)) === $t,它内部做了长度预检与短路优化,尤其在$t很长而$s很短时更快。
? 对应的其他新字符串函数(同批引入,便于配套使用)
-
str_starts_with():判断是否开头匹配; -
str_contains():判断是否包含某子串(取代strpos($s, $t) !== false)。
这组函数共同构成了 PHP 8.0 字符串判断的现代语法基石,代码更可读、更少出错、无需额外依赖。
不复杂但容易忽略——只要确认运行环境 ≥ PHP 8.0,就能放心用。
立即学习“PHP免费学习笔记(深入)”;



















