PHP8中?->运算符在IF语句及类方法调用的用法确认
关于PHP8空安全运算符的等价性问题
问题1:旧版if ($a && $a->b())能否改写为if ($a?->b())?
不完全等价,核心差异在于对非null假值的处理:
- 当
$a为null或未定义时:两种写法效果一致,都不会执行$a->b(),if条件为假。 - 当
$a是非null的假值(比如false、0、空字符串''):- 旧写法
$a && $a->b()会因$a为假直接短路,不调用b(),if条件为假。 - 新写法
$a?->b()会因$a不是null,尝试调用b(),最终if条件取决于b()的返回值。
- 旧写法
如果你的场景中$a只会是对象实例或null,不会出现其他假值,两种写法可以互换;否则需要注意上述逻辑差异。
问题2:$a?->b()能否替代if ($a) { $a->b(); }?
同样存在假值判断的差异:
- 当
$a为null或未定义时:两种写法都不会调用b(),效果一致。 - 当
$a是非null的假值:- 旧写法
if ($a)不会执行$a->b()。 - 新写法
$a?->b()会调用b()。
- 旧写法
只有当$a的取值范围仅为对象实例或null时,才能安全替代;如果$a可能是其他假值,两种写法逻辑完全不同。
内容的提问来源于stack exchange,提问作者linuxoid
相关产品推荐
相关产品推荐

