Смотря в php 7 на пути, но <=> смущает меня.
Большую часть времени я использую условные операторы, они используются в логических ситуациях (которые <=> почти есть, но не совсем, возможность вернуть -1). (Если Х <=> Y). Так что я не уверен, что произойдет в следующих случаях …
if ($x <=> $y) {
// Do all the 1 things
} else {
// Do all the 2 things
}
Что я могу ожидать, если ему предшествует …
$x = 0; $y = 1;
или же
$x = "Carrot"; $y = "Carrot Juice";
или же
$x = "Carrot Juice"; $y = "Carrot";
или же
$x = array(carrot, juice); $y = "carrot juice";
Там определенно достаточно случаев, что меня смущает то, что он будет делать.
оператор космического корабля <=>
это неассоциативным бинарный оператор с тем же приоритетом, что и операторы равенства (==
, !=
, ===
, !==
).
Целью этого оператора является упрощение трехстороннего сравнения между левым и правым операндами.
Оператор может выдать любой из следующих результатов:
0
: когда оба операнда равны-1
: когда левый операнд меньше правого операнда1
: когда левый операнд больше правого операнда.Итак, это означает:
1 <=> 1; // output : 0
1 <=> 2; // output : -1
2 <=> 1; // output : 1
Хорошее практическое применение этого оператора — обратные вызовы типа сравнения, которые, как ожидается, будут возвращать нулевое, отрицательное или положительное целое число на основе трехстороннего сравнения между двумя значениями. Функция сравнения передана usort
один из таких примеров.
До PHP 7 вы написали бы это:
$arr = [4,2,1,3];
usort($arr, function ($a, $b) {
if ($a < $b) {
return -1;
} elseif ($a > $b) {
return 1;
} else {
return 0;
}
});
Начиная с PHP 7, вы можете написать это:
$arr = [4,2,1,3];
usort($arr, function ($a, $b) {
return $a <=> $b;
});
Оператор космического корабля (и другие дополнения PHP 7) объясняется простым языком здесь:
https://blog.engineyard.com/2015/what-to-expect-php-7
Это в основном полезно в функции сравнения, предоставляемой таким функциям, как usort
,
// Pre PHP 7
function order_func($a, $b) {
return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
}
// Post PHP 7
function order_func($a, $b) {
return $a <=> $b;
}
Это не очень полезно в if
, так как if
только проверяет, является ли значение истинным или ложным, различные истинные значения, представляющие порядок, не различаются. Если вы используете его в логическом контексте, он будет рассмотрен true
когда значения разные (потому что 1
а также -1
надоедают правду), false
когда они равны (потому что 0
это фальси) Это похоже на попытку использовать strcmp()
а также stricmp()
в логическом контексте, поэтому вы часто видите
if (stricmp($x, $y) == 0)
Даны правила использования массивов с операторами сравнения. Вот (прокрутите вниз до таблицы с надписью Сравнение с различными типами). При сравнении массива с другим массивом, правило таково:
Массив с меньшим числом элементов меньше, если ключ от операнда 1 не найден в операнде 2, тогда массивы несопоставимы, в противном случае — сравните значение по значению
При сравнении массива с другим типом массив всегда больше. Так array('carrot', 'juice') <=> 'carrot juice'
будет 1
,
Почему бы просто не попробовать и не поиграть с новым космическим кораблем?
Кроме того, если вам интересно, как сравнение оператор космического корабля работает, см .: http://php.net/manual/en/types.comparisons.php
Но теперь, если мы хотим немного подробнее рассказать о ваших тестовых данных:
Первый случай:
//Test data
$x = 0;
$y = 1;
//operator
0 <=> 1 //0 is smaller than 1, so result: -1
//-1 evaluates to TRUE in the if statement
Второй случай:
//Test data
$x = "Carrot";
$y = "Carrot Juice";
//operator
"Carrot" <=> "Carrot Juice" //"Carrot" is smaller than "Carrot Juice", so result: -1
//-1 evaluates to TRUE in the if statement
Третий случай:
//Test data
$x = "Carrot Juice";
$y = "Carrot";
//operator
"Carrot Juice" <=> "Carrot" //"Carrot Juice" is bigger than "Carrot", so result: 1
//1 evaluates to TRUE in the if statement
Четвертый случай:
//Test data
$x = array("carrot", "juice");
$y = "carrot juice";
//operator
array("carrot", "juice") <=> "carrot juice" //array("carrot", "juice") is bigger than "carrot juice", so result: 1
//1 evaluates to TRUE in the if statement