<=> in php 7 在检查 bool 值的情况下如何响应?

How does <=> in php 7 responsed in situations that check bool values?

正在查看 php 7,但 <=> 让我感到困惑。

大多数时候我使用条件运算符,它们用于布尔情况(<=> 几乎,但不完全是,也能够 return -1)。 (如果 X <=> Y)。所以我不确定在以下情况下会发生什么...

if ($x <=> $y) {
    // Do all the 1 things
} else {
    // Do all the 2 things
}

如果它前面有...我能期待什么

$x = 0; $y = 1;

$x = "Carrot"; $y = "Carrot Juice";

$x = "Carrot Juice"; $y = "Carrot";

$x = array(carrot, juice); $y = "carrot juice";

肯定有足够多的案例让我困惑它会做什么。

为什么不自己尝试一下,然后玩转你得到的那艘新宇宙飞船呢?

Demo

此外,如果您想知道如何比较 spaceship operator works, see: http://php.net/manual/en/types.comparisons.php


但是现在如果我们想更详细地了解您的测试数据:

  1. 第一种情况:

    //Test data
    $x = 0;
    $y = 1;
    

    //operator
    0 <=> 1 //0 is smaller than 1, so result: -1
    //-1 evaluates to TRUE in the if statement
    
  2. 第二种情况:

    //Test data
    $x = "Carrot";
    $y = "Carrot Juice";
    

    //operator
    "Carrot" <=> "Carrot Juice" //"Carrot" is smaller than "Carrot Juice", so result: -1
    //-1 evaluates to TRUE in the if statement
    
  3. 第三种情况:

    //Test data
    $x = "Carrot Juice";
    $y = "Carrot";
    

    //operator
    "Carrot Juice" <=> "Carrot" //"Carrot Juice" is bigger than "Carrot", so result: 1
    //1 evaluates to TRUE in the if statement
    
  4. 第四种情况:

    //Test data
    $x = array("carrot", "juice");
    $y = "carrot juice";
    

    //operator
    array("carrot", "juice") <=> "carrot juice" //array("carrot", "juice") is bigger than "carrot juice", so result: 1
    //1 evaluates to TRUE in the if statement
    

宇宙飞船操作员(以及其他 PHP 7 个新增内容)在此处以通俗易懂的语言解释:

https://blog.engineyard.com/2015/what-to-expect-php-7

它主要用于提供给 usort.

等函数的比较函数
// Pre PHP 7
function order_func($a, $b) {
    return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
}

// Post PHP 7
function order_func($a, $b) {
    return $a <=> $b;
}

if中用处不大,因为if只检查值是真值还是假值,不区分表示顺序的不同真值。如果你确实在布尔上下文中使用它,当值不同时它将被认为是 true(因为 1-1 是真实的),false 当它们'重新相等(因为 0 是错误的)。这类似于尝试在布尔上下文中使用 strcmp()stricmp(),这就是为什么您经常看到

if (stricmp($x, $y) == 0)

here 给出了将数组与比较运算符一起使用的规则(向下滚动到标记为与各种类型进行比较 的table)。比较一个数组和另一个数组时,规则是:

Array with fewer members is smaller, if key from operand 1 is not found in operand 2 then arrays are uncomparable, otherwise - compare value by value

将数组与另一种类型进行比较时,数组总是更大。所以 array('carrot', 'juice') <=> 'carrot juice' 将是 1.

简介

spaceship operator <=> 是一个 non-associative 二元运算符,其优先级与相等运算符相同(==!=, ===, !==).

此运算符的目的是允许在 left-hand 和 right-hand 操作数之间进行更简单的 three-way 比较。


可能的结果

操作员可以产生以下任何结果:

  • 0 :当两个操作数相等时
  • -1:当left-hand操作数小于right-hand操作数时
  • 1:当left-hand操作数大于right-hand操作数时。

所以,这意味着:

1 <=> 1; // output : 0
1 <=> 2; // output : -1
2 <=> 1; // output : 1

实际应用

使用此运算符的一个很好的实际应用是在比较类型回调中,根据两个值之间的 three-way 比较,预期 return 零、负或正整数。传递给 usort 的比较函数就是这样一个例子。

在PHP 7之前,你会这样写:

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
    if ($a < $b) {
        return -1;
    } elseif ($a > $b) {
        return 1;
    } else {
        return 0;
    }
});

因为PHP7,你可以这样写:

$arr = [4,2,1,3];

usort($arr, function ($a, $b) {
    return $a <=> $b;
});