?: 运算符(也称为“Elvis运算符”)在PHP中

33 浏览
0 Comments

?: 运算符(也称为“Elvis运算符”)在PHP中

今天在一些PHP代码中看到了这个:\n

$items = $items ?: $this->_handle->result('next', $this->_result, $this);

\n我对这里使用的?:运算符不熟悉。它看起来像是一个三元运算符,但如果断言为真时要计算的表达式被省略了。这是什么意思?

0
0 Comments

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运算符来提供更可靠的方式来设置默认值。

0
0 Comments

自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运算符,并且在需要完整的三元运算符时也能正确处理。这样可以更好地控制代码的逻辑和结果。

0
0 Comments

在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

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)的介绍及用法。

0