【原创】关于PHP标准库函数 spl_object_hash() 函数的疑惑【已解决】
spl_object_hash()函数作用:
由于PHP中不允许使用对象作为数组的键,所以我们可以使用PHP的SPL标准库中提供的 spl_object_hash() 函数,这个函数可以为所有的对象实例创建一个唯一的标识符,从而允许在数组中存储对象的散列值作为键值。
spl_object_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 恒相等?表示不理解。
问题原因详见截图:
版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。
第17行执行后 User 对象生命周期结束,被内核作为垃圾回收,其内存空间很有可能被第18行的语句占用。
也就是说先后两个 User 虽然属于不同对象,但是他们在不同的时间占用了相同的内存位置。而 spl_object_hash 函数是根据内存位置计算散列值的,所以会出现两个对象的哈希值一样的情况。