У меня есть две переменные объекта в PHP, назовем их $a
и $b
. Я предполагаю, что они оба – один и тот же объект. И действительно, вызов spl_object_hash()
подтверждает это, но каждый из них имеет разные свойства.
Когда я запускаю:
if(spl_object_hash($a) === spl_object_hash($b)){ echo "SAME HASH\n"; }else{ echo "DIFFERENT HASH\n"; } if(print_r($a,TRUE) === print_r($b,TRUE)){ echo "SAME PRINT_R\n"; }else{ echo "DIFFERENT PRINT_R\n"; } if($a === $b){ echo "IDENTICAL"; }else{ echo "NOT IDENTICAL"; }
Я получил:
SAME HASH DIFFERENT PRINT_R NOT IDENTICAL
Это меня озадачило. Когда же объект на самом деле представляет собой два разных объекта?
Существует различие между тем, как быть одним и тем же объектом, и иметь те же свойства.
$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.
В зависимости от версии PHP и операционной системы PHP может отличать две сравниваемые строки хеширования от целых чисел до их сравнения (потому что они выглядят как числовые). Либо потому, что результирующие числа очень велики, либо содержат буквы, отливка может привести к потере данных и, таким образом, привести к одному и тому же значению int для обеих строк. Попробуй это:
if ('X'.spl_object_hash($a) === 'X'.spl_object_hash($b)) { ...