Что такое <=> (оператор "Космический корабль") в 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 если право больше. Он использует те же правила сравнения, что и наши существующие операторы сравнения: <, <=, ==, >= а также >,

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

Другие вопросы по тегам