2015-05-21 14 views
88

PHP 7, che uscirà a novembre di quest'anno, introdurrà l'operatore Spaceship (=>). Che cos'è e come funziona?Che cos'è <=> (l'operatore 'Spaceship') in PHP 7?

Questa domanda ha già an answer nella nostra domanda di riferimento generale sugli operatori PHP.

+0

La versione corrente di PHP è PHP 5.x, PHP 7 è forse una bozza e può essere modificata molte volte in futuro. – panther

+0

http://www.crazyengineers.com/threads/php7-spaceship-operator-explanation-questions-answers.79761/ – Cactus

+0

https://wiki.php.net/rfc/combined-comparison-operator – mpkorstanje

risposta

138

Questo <=> operatore offrirà comparatore combinati dal fatto sarà:

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 

Le regole utilizzate dall'operatore confronto combinati sono stessi operatori di confronto attualmente usato da PHP viz. <, <=, ==, >= e >. Coloro che provengono da uno sfondo di programmazione Perl o Ruby potrebbero già avere familiarità con questo nuovo operatore proposto per 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 
+5

Ma come vengono confrontate le stringhe? Sta esaminando i personaggi, il conteggio dei personaggi nelle stringhe e così via? –

+0

@AltafHussain vedi questa risposta: (http://stackoverflow.com/a/17371819/4337069) –

+0

È anche noto come operatore spaziale in PHP, aveva pubblicato la descrizione completa su http://www.techflirt.com/spaceship -operator-in-php –

0

È un nuovo operatore per il confronto combinato. Simile a strcmp() o version_compare() nel comportamento, ma può essere utilizzato su tutti i valori generici di PHP con la stessa semantica di <, < =, ==,> =,>. Restituisce 0 se entrambi gli operandi sono uguali, 1 se la sinistra è maggiore e -1 se la destra è maggiore. Utilizza esattamente le stesse regole di confronto utilizzate dai nostri operatori di confronto esistenti: <, < =, ==,> = e>.

click here to know more

31

Secondo the RFC that introduced the operator, $a <=> $b viene valutato come:

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

wh ich sembra essere il caso, in pratica, in ogni situazione ho provato, anche se rigorosamente il official docs offrono solo la garanzia leggermente più debole che $a <=> $b tornerà

un intero minore, uguale o maggiore di zero quando $a è rispettivamente inferiore, uguale o superiore a $b

Indipendentemente da ciò, perché desideri un operatore del genere? Anche in questo caso, la RFC risolve questo problema: è quasi completamente più conveniente scrivere funzioni di confronto per usort (e simili uasort e uksort).

usort prende una matrice per ordinare come primo argomento e una funzione di confronto definita dall'utente come secondo argomento. Utilizza tale funzione di confronto per determinare quale tra una coppia di elementi dell'array è maggiore. La funzione di confronto deve restituire:

un numero intero minore di, uguale ao maggiore di zero se il primo argomento è considerato rispettivamente inferiore, uguale o superiore al secondo.

L'operatore navicella rende questo succinta 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']; 
}); 

Ulteriori esempi di funzioni di comparazione scritte utilizzando l'operatore spaziale può essere trovato nella sezione Usefulness del RFC.

Problemi correlati