PHP spl_object_hash 不同对象hash_code一样的原因
spl_object_hash 的一个坑,hash一样以为是同一个对象的,原来地址使用了同一个,前面的被释放掉了,做一个笔记
<?php class User { public $id = ''; public $name = ''; public function __construct($name = '') { $this->name = $name; $this->id = spl_object_hash($this); } } $user1 = new User('blogdaren'); $user2 = new User('blogdaren'); $t1 = spl_object_hash(new User('blogdaren')); $t2 = spl_object_hash(new User('blogdaren')); //1. $user1->id !== $user2->id, it seems to be ok. //2. $t1 === $t2, it seems to be equal, so why? var_dump($user1->id, $user2->id, $user1->id === $user2->id, $t1, $t2, $t1 === $t2);
spl_object_hash()函数疑惑:
(1)$user1->id !== $user2->id 不相等,这符合预期。
(2)14-15行代码、17-18行代码,前后分别 new 同一个对象的四个不同实例,为什么 $t1 === $t2 恒相等?表示不理解。
因为 spl_object_hash 函数是根据同一内存位置不可能存在两个对象,这个原理作为散列依据。
第17行执行后 User 对象生命周期结束,被内核作为垃圾回收,其内存空间很有可能被第18行的语句占用。
也就是说先后两个 User 虽然属于不同对象,但是他们在不同的时间占用了相同的内存位置。而 spl_object_hash 函数是根据内存位置计算散列值的,所以会出现两个对象的哈希值一样的情况。
参考原文如下:
http://php.net/manual/zh/function.spl-object-hash.php#76220
http://www.blogdaren.com/post-2482.html?from=groupmessage