Что такое <=> ( "Оператор космического корабля" ) в PHP 7?

PHP 7, который выйдет в ноябре этого года, представит оператор Spaceship (< = > ). Что это такое и как оно работает?

Этот вопрос уже имеет ответ в нашем общем справочном вопросе о операторах PHP.

Ответ 1

Этот оператор <=> предложит комбинированное сравнение, так как он будет:

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; //outputs 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

Ответ 2

Согласно RFC, который представил оператор, $a <=> $b оценивает:

  • 0, если $a == $b
  • -1 if $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'];
});

Дополнительные примеры функций сравнения, написанные с помощью оператора космического корабля, можно найти в разделе Usefulness в RFC.

Ответ 3

Это новый оператор для комбинированного сравнения. По поведению похож на strcmp() или version_compare(), но его можно использовать со всеми общими значениями PHP с той же семантикой, что и <, <=, ==, >=, >. Он возвращает 0, если оба операнда равны, 1, если левый больше, и -1, если правый больше. Он использует те же самые правила сравнения, что и наши существующие операторы сравнения: <, <=, ==, >= и >.

Нажмите здесь, чтобы узнать больше