what - O que é<=>(o operador 'Spaceship') no PHP 7?




what is in php (2)

Esta pergunta já tem uma resposta aqui:

O PHP 7, que será lançado em novembro deste ano, apresentará o operador Spaceship (<=>). O que é e como funciona?

Esta pergunta já tem uma resposta em nossa pergunta de referência geral sobre operadores PHP.


É um novo operador para comparação combinada. Semelhante ao comportamento strcmp() ou version_compare (), mas pode ser usado em todos os valores genéricos do PHP com a mesma semântica que < , <= , == , >= , > . Retorna 0 se ambos os operandos forem iguais, 1 se a esquerda for maior e -1 se a direita for maior. Ele usa exatamente as mesmas regras de comparação usadas pelos nossos operadores de comparação existentes: < , <= , == , >= e > .

wiki.php.net/rfc/combined-comparison-operator


De acordo com wiki.php.net/rfc/combined-comparison-operator , $a <=> $b avalia:

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

o que parece ser o caso na prática em todos os cenários que eu tentei, embora estritamente os documentos oficiais ofereçam apenas a garantia $a <=> $b pouco mais fraca de que $a <=> $b retornará

um número inteiro menor que, igual a ou maior que zero quando $a é respectivamente menor que, igual a ou maior que $b

Independentemente disso, por que você quer um operador assim? Mais uma vez, o RFC trata disso - é praticamente inteiramente mais conveniente escrever funções de comparação para o usort (e o uasort e uksort similares).

usort usa uma matriz para classificar como seu primeiro argumento e uma função de comparação definida pelo usuário como seu segundo argumento. Ele usa essa função de comparação para determinar qual dos dois elementos da matriz é maior. A função de comparação precisa retornar:

um número inteiro menor que, igual a ou maior que zero se o primeiro argumento for considerado respectivamente menor que, igual a ou maior que o segundo.

O operador da nave espacial torna isso sucinto e conveniente:

$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'];
});

Mais exemplos de funções de comparação escritas usando o operador de nave espacial podem ser encontradas na seção Usefulness da RFC.





spaceship-operator