PHP 8 中应使用空安全操作符 $user?->getName()?->trim() 替代 is_null($var) && $var->method(),它在任一环节为 null 时静默返回 null;strpos() 建议替换为 str_contains() 避免类型误判;注意 utf8_encode/decode 等函数已弃用,版本比较须用 version_compare()。
PHP 8 里 is_null($var) && $var->method() 怎么安全改写
PHP 8 不再允许在 null 值上调用方法,直接报 Fatal error: Uncaught Error: Call to a member function ... on null。以前靠 is_null() 或 !isset() 手动判断再调用,现在推荐用空安全操作符 ?-> 替代——它不是“替代 is_null”,而是替代整个“判空 + 调用”的组合逻辑。
常见错误写法:if (!is_null($user)) { $name = $user->getName(); } → 冗余且易漏判嵌套属性
-
$name = $user?->getName()?->trim();:任一环节为null,整条链返回null,不报错 - 不能用于静态调用、
new、clone、isset()等场景,仅限对象实例方法和属性访问 - 返回值类型需注意:原本可能抛异常的地方,现在静默返回
null,下游要兼容null类型(尤其启用了严格类型时)
PHP 7 的 strpos($str, 'abc') !== false 必须换成 str_contains() 吗
不是“必须”,但强烈建议换。PHP 8.0 引入 str_contains() 就是为解决 strpos 易错问题:它返回 int|false,而 == 判定会因类型转换导致误判(如 strpos('abc', 'a') == 0 为 true,但 === false 才是正确写法)。
- 直接替换:
str_contains($str, 'abc')返回布尔值,语义清晰,无类型陷阱 - 注意:只支持字符串参数,不接受数组或
null;若输入可能为null,需提前过滤,否则抛TypeError - 性能几乎无差异,底层仍走优化过的字节扫描,不必担心变慢
还有哪些 PHP 7 常用函数在 PHP 8 被标记弃用或移除
除了 create_function()(已移除)、each()(已移除)、mysql_* 系列(早被废弃),迁移时高频踩坑的还有: