?: 运算符(也称为“Elvis运算符”)在PHP中
PHP中的Elvis运算符是什么?为什么会出现这个问题?解决方法是什么?
在PHP中,Elvis运算符是一种用于设置变量默认值的方法。在之前的版本中,如果我们想要给一个变量设置默认值,我们通常使用三元运算符来实现,但是在处理数组时会出现一些问题。为了解决这个问题,PHP 7引入了Null Coalesce运算符。
在旧版本的PHP中,我们必须在三元运算符的条件判断中使用isset()函数来检查数组中的值是否存在。然而,当我们想要给一个变量设置默认值时,使用Elvis运算符可能会导致一些意外的结果。在给定的代码示例中,$param1和$param2的结果符合预期,但是$param3的结果却不正确。这是因为当数组中的值为false时,Elvis运算符会触发一个E_NOTICE错误。
为了解决这个问题,PHP 7引入了Null Coalesce运算符。Null Coalesce运算符使用了更严格的条件判断,只有在变量严格等于null时才会使用默认值。这样就避免了Elvis运算符中可能出现的问题。
,Elvis运算符在PHP中的使用存在一些问题,特别是在处理数组时。为了解决这个问题,PHP 7引入了Null Coalesce运算符,它使用了更严格的条件判断来避免意外的结果。虽然有人可能会使用错误抑制语法(@符号)来处理这个问题,但是这并不是一个好的解决方法。
Elvis运算符的出现是为了给变量设置默认值,但是在处理数组时可能会导致意外的结果。为了解决这个问题,PHP 7引入了Null Coalesce运算符来提供更可靠的方式来设置默认值。
自PHP 5.3以来,我们可以在三元运算符中省略中间部分。表达式`expr1 ?: expr3`的返回值是:如果`expr1`为真,则返回`expr1`,否则返回`expr3`。
实际上,文档是正确的。`expr2`发生了什么事情呢?它只是消失了,并且不会被评估。`$this->expensiveComputation() ?: "nope"`与`$this->expensiveComputation() ? $this->expensiveComputation() : "nope"`并不相同- `expr1`只会被评估一次。
这种语法的出现是为了简化代码,并且在某些情况下提高代码的可读性。当我们只关心`expr1`是否为真,并且不需要知道`expr2`的值时,可以使用这种简化的语法。
要解决这个问题,我们只需将`expr1 ?: expr3`替换成完整的三元运算符`expr1 ? expr1 : expr3`。这样就能确保`expr1`被评估两次,以及获得正确的结果。
这是一个示例代码,展示了如何使用Elvis运算符以及如何解决问题:
// 使用Elvis运算符 $result = $this->expensiveComputation() ?: "nope"; echo $result; // 解决问题 $result = $this->expensiveComputation() ? $this->expensiveComputation() : "nope"; echo $result;
通过这种方式,我们可以在需要的时候使用Elvis运算符,并且在需要完整的三元运算符时也能正确处理。这样可以更好地控制代码的逻辑和结果。
在PHP中,(?: operator (the 'Elvis operator')) 是一种简化条件语句的运算符。它的作用是如果左操作数为真值(truthy),则返回左操作数,否则返回右操作数。
在伪代码中,foo = bar ?: baz;
大致等同于 foo = bar ? bar : baz;
或者 if (bar) { foo = bar; } else { foo = baz; }
,不同之处在于 bar
只会被计算一次。
还可以利用这个运算符对变量进行自我检查,如下所示:foo = foo ?: bar;
。如果 foo
是空或者假值(falsey),则将 bar
赋值给 foo
,否则保持 foo
不变。
以下是一些示例:
var_dump(5 ?: 0); // 5 var_dump(false ?: 0); // 0 var_dump(null ?: 'foo'); // 'foo' var_dump(true ?: 123); // true var_dump('rock' ?: 'roll'); // 'rock' var_dump('' ?: 'roll'); // 'roll' var_dump('0' ?: 'roll'); // 'roll' var_dump('42' ?: 'roll'); // '42'
顺便提一下,这个运算符被称为 Elvis operator。
请确保括号中的变量存在,否则会引发错误。PHP 不会默认将其值设为 null
或其他任何值。
那为什么不直接使用 ||
运算符呢?比如 blah || 'default'
?
因为在 PHP 中,||
运算符始终返回布尔值,而不是返回最左边的真值操作数。
对于任何想知道的人,空字符串是假值,所以 var_dump('' ?: 'foo');
的结果是 foo
。
通常情况下,我们会遇到类似这样的代码:__construct(MyClient $client = null) { $client = $client ?: new MyClient; }
。当变量只有 null
作为假值选项时,最好使用 $client ??= new MyClient;
,它大致等同于 if ($client === null) { $client = new MyClient; }
。
以上是关于(?: operator (the 'Elvis operator') in PHP)的介绍及用法。