2016-05-12 6 views
0

Я учусь о spl_object_hash() и не совсем понимаю, что за кулисами в этом случае:spl_object_hash() возвращают разные идентификаторы

$obj = new stdClass; 
$id1 = spl_object_hash($obj); 
$id2 = spl_object_hash(new stdClass); 
echo $id1.'<br>'.$id2; 

Q1. Почему $id1 !== $id2?

В ссылке:

Когда объект будет уничтожен, его хэш может быть повторно использован для других объектов.

Q.2 Что-то связано с этим утверждением? Или я пропустил что-то еще?

ответ

3

Что делает spl_object_hash?

[Возвращает] строку, которая уникальна для каждого текущего объекта и всегда одинакова для каждого объекта.

Чтобы уточнить этот оператор: если у вас есть объект A, каждый раз, когда вы используете хэш-объект A, он возвращает одно и то же значение хэш-функции. Если у вас есть объект A и объект B, даже если оба они одного типа и содержат одни и те же значения, их хэши будут отличаться, потому что они не являются одним и тем же объектом (экземпляр).

Поскольку у вас есть два разных объекта, ожидается, что их соответствующие идентификаторы будут отличаться.

+2

Чтобы добавить re: цитату в Q1 - если вы уничтожили '$ id1', прежде чем создавать экземпляр второго экземпляра' stdClass', тогда существует небольшая вероятность повторного использования того же хэша. –

2

Давайте рассмотрим ваш код шаг за шагом.

(1) $obj = new stdClass; 
(2) $id1 = spl_object_hash($obj); 
(3) $id2 = spl_object_hash(new stdClass); 
(4) echo $id1.'<br>'.$id2; 

1: Создать новый StdClass объект.

2: Получить хэш для этого объекта.

3: Получить хэш для другого (полностью другой) объект stdClass.

4: Эхо иды.

Я считаю, что путаница происходит с третьего шага. Вы создаете новый объект, полностью отличный от первого, хотя это тот же тип (класс). И spl_object_hash работает на «уровне объекта», то есть он вернет другой хеш для разных объектов.

Смежные вопросы