比较运算符(飞船运算符)在三元运算符中将如何处理

How will comparison operators (spaceship operator) be handled in ternary operators

这个问题有点先发制人,因为 php 7 还没有发布。我很好奇在三元运算符的上下文中如何处理宇宙飞船运算符。

所以如果我有一个前宇宙飞船三元表达式,例如:

$foo = 1;
$bar = 0;
echo 'foo is ' . ( ($foo > $bar) ? 'greater than' : ( ($foo < $bar ) ? 'less than' : 'equal to' ) ) . ' bar.';

使用比较运算符的等效三元运算符是什么?三元组是否有一些方法来处理这种情况?我经常使用三元运算符,并且很好奇是否有某种方法可以在与比较运算符相关的各种情况下简化代码。

正如您从 its RFC 的文档中看到的那样,飞船运算符主要用于处理排序。

我认为这对缩短您发布的代码没有帮助,主要是因为三元运算符需要一个布尔值,而三元运算符 return 是一个 "true" 值(1和 -1) 在两种情况下,当值不同时。换句话说,当您将其 return 值转换为布尔值时,飞船运算符等同于 != 运算符。

无论如何,你可以像我一样在 3v4l.org 上试验一下 here

这里有一个聪明的方法,使用 宇宙飞船运算符 <=> 作为穷人的三元“三元”,还使用箭头函数和数组解构。

<?php
$relation = fn($a, $b) => [
    -1 => 'less than',
     0 => 'the same as',
     1 => 'greater than'
][$a <=> $b];

$bar = 2;

// loop $foo from 1 through 3
foreach (range(1,3) as $foo) {
  echo "foo is " . $relation($foo, $bar) . " bar.\n";
}
?>

输出:

foo is less than bar.
foo is the same as bar.
foo is greater than bar.

但请注意:它 聪明, 聪明的代码总是需要更多的脑力才能理解,这使得它更难维护。所以有警告。