PHP 7, qui sortira en novembre de cette année, présentera l'opérateur Spaceship (<=>). Qu'est-ce que c'est et comment est-ce que ça marche?
Cette question a déjà ne réponse dans notre question de référence générale sur les opérateurs PHP.
Cet opérateur <=>
proposera une comparaison combinée en ce sens qu'il:
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
Les règles utilisées par l'opérateur de comparaison combinée sont identiques à celles utilisées par PHPviz. <
, <=
, ==
, >=
et >
. Ceux qui sont issus de Perl ou de la programmation Ruby peuvent déjà être familiarisés avec ce nouvel opérateur proposé pour 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
Selon le RFC qui a introduit l'opérateur , $a <=> $b
est évalué à:
$a == $b
$a < $b
$a > $b
ce qui semble être le cas en pratique dans tous les scénarios que j'ai essayés, bien que strictement les documents officiels n'offrent que la garantie légèrement plus faible que $a <=> $b
reviendra
un entier inférieur, égal ou supérieur à zéro lorsque
$a
est respectivement inférieur, égal ou supérieur à$b
Quoi qu'il en soit, pourquoi voudriez-vous un tel opérateur? Encore une fois, la RFC aborde ce problème - il est pratiquement tout à fait plus pratique d’écrire des fonctions de comparaison pour usort
(et similaires uasort
et uksort
).
usort
prend un tableau à trier comme premier argument et une fonction de comparaison définie par l'utilisateur comme deuxième argument. Il utilise cette fonction de comparaison pour déterminer lequel des deux éléments du tableau est le plus grand. La fonction de comparaison doit renvoyer:
un entier inférieur à, égal ou supérieur à zéro si le premier argument est considéré comme étant respectivement inférieur, égal ou supérieur au second.
L'opérateur de vaisseau spatial rend ceci succinct et commode:
$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'];
});
Vous trouverez d'autres exemples de fonctions de comparaison écrites à l'aide de l'opérateur de vaisseau spatial dans la section Utilité de la RFC.
C'est un nouvel opérateur pour la comparaison combinée. Identique à strcmp()
ou version_compare () dans le comportement, mais il peut être utilisé sur toutes les valeurs génériques PHP avec la même sémantique que <
, <=
, ==
, >=
, >
. Il renvoie 0
si les deux opérandes sont égaux, 1
si la gauche est supérieure et -1
si la droite est supérieure. Il utilise exactement les mêmes règles de comparaison que celles utilisées par nos opérateurs de comparaison existants: <
, <=
, ==
, >=
et >
.