совпадения spl_object_hash, объекты не идентичны

#php #oop

#php #ооп

Вопрос:

У меня есть две объектные переменные в PHP, давайте назовем их $a и $b . Я предполагаю, что они оба являются одним и тем же объектом. И, действительно, вызов spl_object_hash() подтверждает это, но у каждого из них разные свойства.

Когда я запускаю:

 if(spl_object_hash($a) === spl_object_hash($b)){
    echo "SAME HASHn";
}else{
    echo "DIFFERENT HASHn";
}

if(print_r($a,TRUE) === print_r($b,TRUE)){
    echo "SAME PRINT_Rn";
}else{
    echo "DIFFERENT PRINT_Rn";
}

if($a === $b){
        echo "IDENTICAL";
    }else{
        echo "NOT IDENTICAL";
    }
  

Я получаю:

 SAME HASH
DIFFERENT PRINT_R
NOT IDENTICAL
  

Это сбило меня с толку. Когда один и тот же объект на самом деле является двумя разными объектами?

Комментарии:

1. Вот var_dump оба хэша. строка (32) «0000000020d6b2fc000000007ad31222» строка (32) «0000000020d6b2f0000000007ad31222»

2. Мне также интересно, почему хэши идентичны. Есть ли что-нибудь, что делает эти объекты особенными? Можете ли вы добавить определение рассматриваемых объектов и их состояний?

3. И откуда взялись эти переменные? Можем ли мы воспроизвести это, или это было бы слишком сложно?

4. Я сумасшедший? Эти хэши не выглядят одинаково для меня. В php === вычисляется как false для меня, когда я сравниваю две строки.

5. Они / не являются / одинаковыми: посмотрите в середину: d6b2fc vs d6b2f0.

Ответ №1:

Есть разница между тем, чтобы быть одним и тем же объектом и иметь одинаковые свойства.

 $a = new stdClass("same", "parameters", 1337);
$b = new stdClass("same", "parameters", 1337);

var_dump($a == $b); //True
var_dump($a === $b); //False!

$b = $a;

var_dump($a === $b); //Now true.
  

Ответ №2:

В зависимости от версии PHP и операционной системы PHP может преобразовать две сравниваемые хэш-строки в целые числа перед их сравнением (поскольку они выглядят числовыми). Либо потому, что результирующие числа очень большие, либо содержат буквы, приведение может привести к потере данных и, таким образом, привести к одинаковому значению int для обеих строк. Попробуйте это:

 if ('X'.spl_object_hash($a) === 'X'.spl_object_hash($b)) { ...
  

Комментарии:

1. Ваш аргумент недопустим при строгом сравнении.