PHP7: spaceship operator
В ПХП7 вошёл новый оператор — «космический корабль». Я его помню со времён программирования на Перле. Наиболее частое применение он, по всей видимости, найдёт в сортировках:
usort($data, function ($o1, $o2) {
return $o1->value <=> $o2->value;
});
Комбинация «меньше», «равно» и «больше» — и есть «космический корабль». Результат его выполнения следующий — если левое меньше, получается «-1», если правое — «1», если значение равны, вернётся ноль. Для строк уже сейчас (с чётвертой версии языка) существует функция strcmp, которая делает то же.
Новый оператор сравнивает даже массивы и объекты, в RFC есть соответствующие примеры:
echo [1, 2, 3] <=> [1, 2, 1]; // 1
echo [1, 2, 3] <=> [1, 2, 4]; // -1
$a = (object) ["a" => "b"];
$b = (object) ["a" => "c"];
echo $a <=> $b; // -1
$a = (object) ["a" => "c"];
$b = (object) ["a" => "b"];
echo $a <=> $b; // 1
// only values are compared
$a = (object) ["a" => "b"];
$b = (object) ["b" => "b"];
echo $a <=> $b; // 0
В общем, какой-то особенной пользы в язык конструкция не принесёт, но в в неких частных случаях читаемость улучшится.
Всё-таки, комбинация меньше», «равно» и «больше».
ну можно будет иногда if() менять на switch() что меня всегда радует :)
Комментарий для Кай:
И правда. Не понимаю почему я так написал.
Комментарий для hshhhhh.name:
В каких случаях?
Наверно так:
-----------------
switch( a <=> b)
{
case -1: break;
case 1: break;
case 0: break;
};
----------------
Но где это применить практически — непростой вопрос.
Хотя...
Например, промежутки дат:
дата начала больше даты финиша — ошибка
дата начала совпадает с датой финиша — нормально, обработать одним образом
дата начала меньше даты финиша — нормально, обработать другим образом.
Не знал, что можно сравнивать массивы. Теперь вместо
буду писать