PHP 7 中的 <=>("宇宙飞船"操作员)是什么?



PHP 7引入了Spaceship (<=>)操作符。它是什么,它是如何工作的?

<=> ("Spaceship")运算符将提供组合比较,因为它将:

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

组合比较运算符使用的规则与PHP目前使用的比较运算符相同,即<, <=, ==, >=>。有Perl或Ruby编程背景的人可能已经熟悉这个为PHP7提议的新操作符。

   //Comparing Integers
    echo 1 <=> 1; //output  0
    echo 3 <=> 4; //output -1
    echo 4 <=> 3; //output  1
    
    //String Comparison
    
    echo "x" <=> "x"; //output  0
    echo "x" <=> "y"; //output -1
    echo "y" <=> "x"; //output  1

当您以这种方式比较字符串时,它将从左到右比较给定字符串中的每个字符以查看它们是否不同,直到找到差异,然后它将通过比较最后一个字符的ASCII值来决定哪个字符串更大。

根据引入该操作符的RFC, $a <=> $b的计算结果为:

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

在我尝试过的每个场景中似乎都是这样,尽管严格来说官方文档只提供了$a <=> $b将返回

的稍微弱一点的保证。

$a分别小于、等于或大于$b时,

小于、等于或大于0的整数

不管怎样,为什么需要这样的操作符?同样,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'];
});

使用spaceship操作符编写比较函数的更多示例可以在RFC的有用性部分找到。

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

点击这里了解更多

最新更新