什么是< => (PHP中的' Spaceship'运算符)?

时间:2015-05-21 05:35:51

标签: php operators php-7 spaceship-operator

PHP 7将于今年11月推出,它将引入Spaceship(< =>)运算符。它是什么以及它是如何工作的?

这个问题在关于PHP运算符的一般参考问题中已经有an answer

3 个答案:

答案 0 :(得分:218)

<=>运算符将提供组合比较,它将:

Return 0 if values on either side are equal
Return 1 if value on the left is greater
Return -1 if the value on the right is greater

组合比较运算符使用的规则与PHP viz当前使用的比较运算符相同。 <<===>=>。那些来自Perl或Ruby编程背景的人可能已经熟悉为PHP7提出的这个新运算符。

   //Comparing Integers

    echo 1 <=> 1; //ouputs 0
    echo 3 <=> 4; //outputs -1
    echo 4 <=> 3; //outputs 1

    //String Comparison

    echo "x" <=> "x"; // 0
    echo "x" <=> "y"; //-1
    echo "y" <=> "x"; //1

答案 1 :(得分:47)

根据the RFC that introduced the operator$a <=> $b评估为:

  • 0 if $a == $b
  • -1 if $a < $b
  • 1 if $a > $b

在我尝试过的每个场景中似乎都是实际情况,尽管严格来说official docs仅提供$a <=> $b将返回的稍微弱一点的保证

  当$a分别小于,等于或大于$b

时,

小于,等于或大于零的整数

无论如何,你为什么要这样的运营商?再一次,RFC解决了这个问题 - 它几乎完全是为了更方便地为usort(以及类似的uasortuksort)编写比较函数。

usort将数组排序为其第一个参数,并将用户定义的比较函数作为其第二个参数。它使用该比较函数来确定数组中的哪一对元素更大。比较函数需要返回:

  

如果第一个参数被认为分别小于,等于或大于第二个参数,则小于,等于或大于零的整数。

宇宙飞船运营商使这个简洁方便:

$things = [
    [
        'foo' => 5.5,
        'bar' => 'abc'
    ],
    [
        'foo' => 7.7,
        'bar' => 'xyz'
    ],
    [
        'foo' => 2.2,
        'bar' => 'efg'
    ]
];

// Sort $things by 'foo' property, ascending
usort($things, function ($a, $b) {
    return $a['foo'] <=> $b['foo'];
});

// Sort $things by 'bar' property, descending
usort($things, function ($a, $b) {
    return $b['bar'] <=> $a['bar'];
});

使用太空飞船运营商编写的比较函数的更多示例可以在RFC的Usefulness部分找到。

答案 2 :(得分:0)

它是一个新的运算符,用于组合比较。与行为中的strcmp()或version_compare()类似,但它可以在所有通用PHP值上使用,其语义与<<===,{{1 },>=。如果两个操作数相等,则返回>;如果左侧更大,则返回0;如果右侧更大,则返回1。它使用与我们现有比较运算符使用的完全相同的比较规则:-1<<===>=

click here to know more