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

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

这个问题在我们关于PHP运算符的一般参考问题中已经有了答案 。

<=>运营商将提供综合比较,因为它将:

 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当前使用的比较运算符相同。 <<===>=> 。 那些来自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 

根据引入运算符的RFC , $a <=> $b评估为:

  • 0如果$a == $b
  • -1如果$a < $b
  • 1如果$a > $b

在我尝试过的每一种情况下,似乎都是这种情况,尽pipe严格的官方文档只提供了稍微弱一些的保证,即$a <=> $b将会返回

$a分别小于,等于或大于$b时,小于,等于或大于零的整数

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

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

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

飞船操作员使这个简洁和方便:

 $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的有用性部分可以find更多使用太空飞船操作员编写的比较函数的例子。

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

点击这里了解更多