【原创】关于PHP标准库函数 spl_object_hash() 函数的疑惑【已解决】

blogdaren 2018-09-17 2评论 292人次

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 恒相等?表示不理解。

问题原因详见截图:

33.png

版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。

本文链接:【原创】关于PHP标准库函数 spl_object_hash() 函数的疑惑【已解决】

用户评论:

2018-09-18 11:37
因为 spl_object_hash 函数是根据同一内存位置不可能存在两个对象,这个原理作为散列依据。
第17行执行后 User 对象生命周期结束,被内核作为垃圾回收,其内存空间很有可能被第18行的语句占用。
也就是说先后两个 User 虽然属于不同对象,但是他们在不同的时间占用了相同的内存位置。而 spl_object_hash 函数是根据内存位置计算散列值的,所以会出现两个对象的哈希值一样的情况。
blogdaren
2018-09-18 17:06
@一只贱熊猫:你理解的原理是对的,受教了。  我把你提供的链接地址贴上来:

http://php.net/manual/zh/function.spl-object-hash.php#76220

发表评论:

您的昵称:
电子邮件:
个人主页: