真实而稳定的对象哈希

时间:2014-01-20 14:54:01

标签: php oop

我需要清楚地识别一个对象并将其标识存储在我的数据库中。 之后我需要这个ID来恢复这个对象。

我尝试使用“spl_object_hash()”(http://php.net/manual/en/function.spl-object-hash.php),但每次重新加载页面时此函数都会返回另一个值。

对于测试,此对象是稳定的并保持不变且完全不变。从来没有“spl_object_hash()”一次又一次地返回不同的结果我会重新加载。

$foo = new stdClass();
print_r(spl_object_hash($foo));

- >每次点击刷新时都会有另一个哈希

我需要一种根据完整对象创建哈希的方法。只要对象没有,这个哈希就不应该改变。

我不想为此实现自己的方法(只要没有其他可能解决我的问题),因为我需要一种快速,简单和统一的方法来识别我的对象。

此外,我不想为此目的使用Sessions。

那么我该怎么做才能解决这个问题?

非常感谢&友好的问候!

2 个答案:

答案 0 :(得分:4)

您可以使用序列化调用(使用overriden __sleep()魔术调用)来序列化对象,以获得唯一的哈希:

$hash = md5(serialize($myObject));

另外,在存储一些额外数据的对象(如PDO处理程序,文件句柄)中,您可以覆盖__sleep()和__wakeup()方法来获取/设置对象数据,例如来自http://www.php.net/manual/en/language.oop5.magic.php#object.sleep的代码

<?php
class Connection
{
    protected $link;
    private $dsn, $username, $password;

    public function __construct($dsn, $username, $password)
    {
        $this->dsn = $dsn;
        $this->username = $username;
        $this->password = $password;
        $this->connect();
    }

    private function connect()
    {
        $this->link = new PDO($this->dsn, $this->username, $this->password);
    }

    public function __sleep()
    {
        return array('dsn', 'username', 'password');
    }

    public function __wakeup()
    {
        $this->connect();
    }
}?>

这应该为您提供良好的对象哈希,更好的是,您可以配置要用于创建哈希的字段。

答案 1 :(得分:1)

您可以随时执行此操作:

function object_hash($object, $algorithm = 'md5') {
    $serialized_object = serialize($foo);

    return hash($algorithm, $serialized_object);
}

$foo = new stdClass();
print_r(object_hash($foo));