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

问题描述 投票:0回答:3

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

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

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

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

ternary-operator spaceship-operator php-7
3个回答
3
投票

宇宙飞船操作员,正如您从其 RFC 的文档中看到的那样,主要是在必须处理订单时使用。

我认为这对缩短您发布的代码没有帮助,主要是因为三元运算符期望一个布尔值,而三元运算符在两种情况下都返回一个“true”值(1和-1)价值观不同。换句话说,当您将其返回值转换为布尔值时,太空船运算符相当于 != 运算符。

无论如何,你可以在 3v4l.org 上进行实验,就像我在这里

所做的那样

0
投票

这是使用 spaceship 运算符

<=>
作为穷人的三向“三元”的巧妙方法,还使用箭头函数和数组解构。

<?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.

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


0
投票

随着 PHP 8 中引入 match 语句,现在这成为可能:

$foo = 0;
$bar = 1;

echo match ($foo <=> $bar) {
  -1      => 'foo is less than bar',
  1       => 'foo is greater than bar',
  default => 'foo and bar are equal'
};

最后一行:

default => 'foo and bar are equal'

也可以是:

0       => 'foo and bar are equal'

因为宇宙飞船运算符将始终只返回这三个值。

© www.soinside.com 2019 - 2024. All rights reserved.