PHP 8.0 中 substr() 的 length 参数可为 null,因函数签名正式支持 ?int 类型,语义为“截取至末尾”,省略或传 null 效果一致,且严格类型下更安全简洁。

substr() 的 length 参数在 PHP 8.0 中可以为 null,根本原因是 函数签名正式支持可空整型(?int),这是 PHP 类型系统演进和向后兼容性优化的直接结果。
PHP 8.0 明确声明了 ?int $length = null
在 PHP 8.0 中,substr() 的官方函数签名更新为:
function substr(string $string, int $offset, ?int $length = null): string
这里的 ?int 表示该参数允许传入 int 或 null,属于显式、安全、无警告的类型支持。它不再依赖隐式转换,也不触发弃用提示。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- ✅ 传
null:合法,语义清晰——“从 offset 开始取到末尾” - ✅ 省略该参数:效果等同于传
null,仍返回完整子串 - ❌ 在 PHP 7.4 里传
null:虽能运行,但会抛出E_DEPRECATED警告(尤其开启E_ALL时)
为什么设计成支持 null?
-
语义更自然:省略长度本就表示“取到结尾”,用
null比用PHP_INT_MAX或字符串长度计算更直观、更安全 -
配合严格类型检查:在启用了
declare(strict_types=1)的文件中,?int允许你写出类型安全又简洁的调用,比如:$part = substr($text, 10, $limit ?? null);
-
统一行为逻辑:
null和未提供参数在内部处理路径一致,都导向“截取至末尾”的分支,避免歧义
实际用法示例
$text = "Hello世界"; substr($text, 0); // → "Hello世界"(省略 length) substr($text, 0, null); // → "Hello世界"(显式传 null,PHP 8.0+ 推荐) substr($text, 0, 5); // → "Hello"(取前 5 字节,注意非中文安全)
注意:若需按字符(而非字节)截取中文,请改用 mb_substr($text, 0, 5, 'UTF-8'),substr() 本身不处理多字节编码。
立即学习“PHP免费学习笔记(深入)”;
不复杂但容易忽略


















