Что такое <=> (оператор "Космический корабль") в PHP 7?
В PHP 7, который выйдет в ноябре этого года, появится оператор Spaceship (<=>). Что это и как это работает?
На этот вопрос уже есть ответ в нашем общем справочном вопросе об операторах PHP.
3 ответа
Это <=>
Оператор предложит комбинированное сравнение в том смысле, что:
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
что, похоже, имеет место на практике в каждом сценарии, который я пробовал, хотя строго официальные документы дают лишь немного более слабую гарантию того, что $a <=> $b
вернусь
целое число меньше, равно или больше нуля, когда
$a
соответственно меньше, равно или больше чем$b
В любом случае, зачем вам такой оператор? Опять же, RFC решает эту проблему - почти полностью сделать так, чтобы было удобнее писать функции сравнения для usort
(и тому подобное uasort
а также uksort
).
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.
Это новый оператор для комбинированного сравнения. Похожий на strcmp()
или version_compare() в поведении, но его можно использовать для всех общих значений PHP с той же семантикой, что и <
, <=
, ==
, >=
, >
, Возвращается 0
если оба операнда равны, 1
если левый больше, и -1
если право больше. Он использует те же правила сравнения, что и наши существующие операторы сравнения: <
, <=
, ==
, >=
а также >
,