в RFC учитывая этот пример:
// only values are compared $a = (object) ["a" => "b"]; $b = (object) ["b" => "b"]; echo $a <=> $b; // 0
Но когда я выполняю это, я получаю 1 как вывод обратно:
$a = (object) ["a" => "b"];
$b = (object) ["b" => "b"];
echo $a <=> $b; //1
Теперь я не поняла как <=> сравнивает объекты? В RFC говорится, что это сравнивается только по значениям.
Постскриптум я использую PHP 7.0.4-6 + deb.sury.org ~ верный + 1 (cli) (NTS) под vagrant
UPD:
php > echo (object)["b"=>"b"] <=> (object)["b"=>"b"];
0
php > echo (object)["b"=>"b"] <=> (object)["a"=>"b"];
1
php > echo (object)["a"=>"b"] <=> (object)["b"=>"b"];
1
При чтении RFC мы обнаруживаем, что это противоречит само себе:
Добавить новый оператор (expr) <=> (expr), он возвращает 0, если оба операнда равны, 1, если левый больше, и -1, если правый больше. Это использует точно такие же правила сравнения как используются нашими существующими операторами сравнения: <, <=, ==,> = и>. (Подробности см. В руководстве)
Замечания: Увидеть ==
, это означает, что оператор космического корабля делает слабое сравнение.
А позже в примерах:
// only values are compared $a = (object) ["a" => "b"]; $b = (object) ["b" => "b"]; echo $a $b; // 0
Оператор космического корабля — это просто комбинация операторов <
, ==
а также >
, И это дает соответствующие возвращаемые значения в зависимости от того, что он оценивает:
operator(s): < = >
return value: -1 0 1
Сейчас массивы а также объекты немного сложнее типы. Чтобы понять, что <=>
PHP оператор космического корабля делает, нам нужно посмотреть и понять, как <
, ==
а также >
работать для массивов и объектов.
Итак, давайте посмотрим на операторы сравнения <
, >
, ==
для каждого типа. Сначала мы посмотрим на <
а также >
а затем после этого мы также смотрим на ==
,
Теперь что касается массивов <
а также >
документированы Вот:
┌───────────┬───────────┬───────────────────────── ─────────────────────────┐ │ тип │ тип │ │ │ операнд 1 │ операнд 2 │ результат │ ├───────────┼───────────┼───────────────────────── ─────────────────────────┤ │ массив │ массив │ Массив с меньшим числом элементов меньше, │ │ │ │ если ключ от операнда 1 не найден в операнде 2 │ │ │ │ тогда массивы несопоставимы, │ │ │ │ в противном случае - сравнить значение по значению │ └───────────┴───────────┴───────────────────────── ─────────────────────────┘
Это также может быть написано и представлено код:
Пример # 2 Транскрипция сравнения стандартного массива
<?php // Arrays are compared like this with standard comparison operators function standard_array_compare($op1, $op2) { if (count($op1) < count($op2)) { return -1; // $op1 < $op2 } elseif (count($op1) > count($op2)) { return 1; // $op1 > $op2 } foreach ($op1 as $key => $val) { if (!array_key_exists($key, $op2)) { return null; // uncomparable } elseif ($val < $op2[$key]) { return -1; } elseif ($val > $op2[$key]) { return 1; } } return 0; // $op1 == $op2 } ?>
Мы можем легко проверить это с помощью некоторого тестирования. С помощью методы, как в математике и всегда меняйте только одну вещь, поэтому мы можем быть уверены, что мы здесь правы:
/**
/*
/* Testing operators: < and >
/*
*/
//Test case
//Variations: amount, values and keys (order)
//Test count: 9
// Failed: 0
// Passed: 9
{
//Test case 1.1
$a = [1];
$b = [1];
//Passed
var_dump("Same amount of elements, keys and values: " . "'<' -> " . bool2str($a < $b) . " '>' -> " . bool2str($a > $b));
//Test case 1.2
$a = [1];
$b = [1, 1];
//Passed
var_dump("NOT same amount of elements, but same values: " . "'<' -> " . bool2str($a < $b) . " '>' -> " . bool2str($a > $b));
//Test case 1.3
$a = [10];
$b = [1, 1];
//Passed
var_dump("NOT same amount of elements nor values: " . "'<' -> " . bool2str($a < $b) . " '>' -> " . bool2str($a > $b));
//Test case 1.4
$a = [1 => 1];
$b = [10 => 1];
//Passed
var_dump("Same amount of element and values, NOT same keys: " . "'<' -> " . bool2str($a < $b) . " '>' -> " . bool2str($a > $b));
//Test case 1.5
$a = [10];
$b = [1];
//Passed
var_dump("Same amount of elements and keys, NOT same values: " . "'<' -> " . bool2str($a < $b) . " '>' -> " . bool2str($a > $b));
//Test case 1.6
$a = [1 => 1, 2 => 1];
$b = [2 => 1, 1 => 1];
//Passed
var_dump("Same amount of elements and keys in different order: " . "'<' -> " . bool2str($a < $b) . " '>' -> " . bool2str($a > $b));
//Test case 1.7
$a = [1 => 1, 2 => 5];
$b = [2 => 5];
//Passed
var_dump("Same values, NOT same amount of elements nor keys: " . "'<' -> " . bool2str($a < $b) . " '>' -> " . bool2str($a > $b));
//Test case 1.8
$a = [10 => 1];
$b = [1 => 10];
//Passed
var_dump("NOT same keys nor values: " . "'<' -> " . bool2str($a < $b) . " '>' -> " . bool2str($a > $b));
//Test case 1.9
$a = [1 => 1, 2 => 1];
$b = [2 => 10, 1 => 1];
//Passed
var_dump("Same amount of elements and values, NOT same keys nor order: " . "'<' -> " . bool2str($a < $b) . " '>' -> " . bool2str($a > $b));
}echo PHP_EOL . PHP_EOL . PHP_EOL; //Test case separator
/**
/*
/* Test case end
/*
*/
//NULL, TRUE, FALSE 2 str func
function bool2str($v){if($v === NULL)return "NULL";elseif($v === FALSE)return "FALSE";elseif($v === TRUE)return "TRUE";else return "UNEXPECTED: '$v'";}
echo $object1 <=> $object2; // 0
Это должно вернуться 0
только если
$object1
а также $object2
экземпляры одного и того же классаВ вашем примере, я бы удивился, если он вернется 0
вместо 1
,
Может быть, опечатка в RFC?