如何在PHP中查找对象ID?

我正在使用PHP 5.2。 我想find一个方法来为每个对象输出一个唯一的ID,所以当查看日志来查看哪些对象是相同的时候很容易。

在Ruby中,我只是说object.object_id来获取Ruby对象的内部标识符。 似乎没有一个明显的方式来做到这一点在PHP中。

是否有内置的方法来做到这一点? 如果没有,可以提供其他build议吗?

使用spl_object_hash()

它为每个对象实例返回一个唯一的标识符,而不是类的名字,所以它看起来更适合你。

编辑:

对于PHP <5.2.x用户,请参阅此答案 。

目前在PHP中没有办法做到这一点,从版本5.3.6。

spl_object_hash()不会做你想做的事情,因为它会在对象被删除时回收标识符,这会导致(例如)试图跟踪会话中的对象的对象关系映射器中的错误。

在文档页面顶部的描述(“这个函数返回对象的唯一标识符,这个id可以用作存储对象或者标识一个对象的散列键”)是错误的 – 事实揭示在在这个页面上注意:“当一个对象被销毁时,它的哈希值可以被重用于其他对象”,换句话说,该函数并不总是返回唯一的标识符,并且不能总是用于存储或标识对象。

在这个注释中演示的技术可能在某些情况下有效,但是它不可靠并且不能一致地工作,因为尝试访问未定义的属性将调用__get()和__set()魔术方法,其结果是不可预知的。

总之,对你的问题的简短回答(不幸的是)是“不” – 在PHP中没有这样的方法,并且没有办法像这样写一个对任何对象都一致的方法。

如果你想看到这个function添加到PHP,请在这里投票和/或评论:

http://bugs.php.net/bug.php?id=52657

我知道这是老话题,但我想我已经find了解决办法。

诀窍在于使用分配的键来存储对数组中每个对象的引用。 然后,您可以通过search该数组并返回find的密钥来获取对象ID。

 <?php class objectMarker { private $storage; function add($object) { $this->storage[] = $object; } function getId($object) { foreach ($this->storage as $id => $item) { if ($item === $object) { return $id; } } return null; } } $marker = new objectMarker; $t1 = new stdClass; $t2 = new stdClass; $marker->add($t1); $marker->add($t2); echo $marker->getId($t1) . "\n"; echo $marker->getId($t2) . "\n"; unset($t1); $t1 = new stdClass; $marker->add($t1); echo $marker->getId($t1) . "\n"; $t2->x = 1; echo $marker->getId($t2) . "\n"; /* output: 0 1 2 1 */