Elvis vs Null Coalescing:PHP开发者的秘密武器

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Elvis vs Null Coalescing:陷阱在哪里?(PHP底层解析)

\n\n

你好,同行!如果你曾经写过PHP代码,肯定遇到过这种情况:需要检查一个变量是否存在,如果存在就使用它的值,如果不存在就使用默认值。这看起来是一个简单的任务,但正是在这里,新手(甚至老手)经常被两个非常相似但本质不同的运算符绊倒:短三元运算符(Elvis运算符)?: 和 null合并运算符 ??。

\n\n

这是Stack Overflow上最热门的问题之一(有数千次浏览和投票)。这并非偶然:它们之间的区别不仅仅是学术上的兴趣。选择错误的运算符可能导致你花几个小时才能找到的bug。让我们一劳永逸地弄清楚它们的“底层机制”以及何时使用哪个。

\n\n

简要介绍:我们为什么需要这些运算符?

\n\n

想象一下,你正在编写代码来显示用户名。如果没有名字,就显示“访客”。经典的方法是使用if:

\n\n
if (isset($userName)) {\n    $displayName = $userName;\n} else {\n    $displayName = '访客';\n}
\n\n

虽然有效,但代码冗长。PHP提供了优雅的简写形式。这时我们就遇到了主要的难题:?: 还是 ???乍一看,它们是一样的。但这只是表面现象。

\n\n

1. Elvis运算符 (?:) — “布尔值之王”

\n\n

Elvis运算符(因其与摇滚之王发型的相似性而得名:?: — 眼睛、鼻子和刘海)早在PHP 5.3版本中就出现了。它是三元运算符的简写形式。

\n\n

语法:

\n
$result = $expression ?: $default;
\n\n

这意味着什么? 解释器会检查$expression。如果它转换为true(即不是“假”值),则返回$expression。如果$expression是“假”值(false、0、空字符串、null、空数组等),则返回$default。

\n\n

重要提示: Elvis运算符不检查变量是否存在。它检查变量的真值。如果变量未定义,你会收到一个Notice: Undefined index/variable。

\n\n

一个带有陷阱的例子:

\n
$count = 0;\n$result = $count ?: 10;\necho $result; // 输出 10,而不是 0!
\n\n

为什么?因为0是一个“假”值(falsy)。Elvis认为变量是“空的”,并返回了备用值。这对很多人来说是一个意外。

\n\n

2. Null合并运算符 (??) — “Notice的救星”

\n\n

null合并运算符出现在PHP 7.0中,并受到了热烈欢迎。它的主要超能力是安全地处理不存在的变量,而不会引发错误。

\n\n

语法:

\n
$result = $expression ?? $default;
\n\n

这意味着什么? 该运算符检查$expression是否存在并且不等于null。如果是,则返回$expression。否则,返回$default。

\n\n

关键区别:??忽略所有“假”值,除了null和未定义(undefined)。0、""、false — 所有这些都被视为有效值,并将被返回。

\n\n

例子:

\n
$count = 0;\n$result = $count ?? 10;\necho $result; // 输出 0!因为变量存在且不为 null。
\n\n

看到区别了吗?这就是主要的“底层”机制。

\n\n

3. “底层”比较:真值表

\n\n

让我们把所有内容整理成一个清晰的表格,以便巩固理解。假设有

博客

书籍推荐