Как оператор & lt; = & gt; сравнить объекты?

в 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

3

Решение

При чтении 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'";}
4

Другие решения

echo $object1 <=> $object2; // 0

Это должно вернуться 0 только если

  • $object1 а также $object2 экземпляры одного и того же класса
  • а также они имеют одинаковые атрибуты и значения.

В вашем примере, я бы удивился, если он вернется 0 вместо 1,
Может быть, опечатка в RFC?

0

По вопросам рекламы [email protected]