#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. Ваш аргумент недопустим при строгом сравнении.