【发布时间】:2011-02-21 18:37:54
【问题描述】:
我不久前在 StackOverflow 上了解到 we can get the "instance ID" of any resource,例如:
var_dump(intval(curl_init())); // int(2)
var_dump(intval(finfo_open())); // int(3)
var_dump(intval(curl_init())); // int(4)
var_dump(intval(finfo_open())); // int(5)
var_dump(intval(curl_init())); // int(6)
我需要类似但适用于类的东西:
class foo {
public function __construct() {
ob_start();
var_dump($this); // object(foo)#INSTANCE_ID (0) { }
echo preg_replace('~.+#(\d+).+~s', '$1', ob_get_clean());
}
}
$foo = new foo(); // 1
$foo2 = new foo(); // 2
上述方法可行,但我希望有一个更快的解决方案,或者至少是一个不涉及输出缓冲区的解决方案。请注意,这不一定会在构造函数中甚至在类本身中使用!
spl_object_hash() 不是我要找的,因为这两个对象产生相同的哈希值
之前的问题包含spl_object_hash 输出的错误示例;确保两个对象同时存在会产生细微不同的哈希:
var_dump(spl_object_hash($foo)); // 0000000079e5f3b60000000042b31773
var_dump(spl_object_hash($foo2)); // 0000000079e5f3b50000000042b31773
转换为 int 类资源似乎不适用于对象:
注意: foo 类的对象无法转换为 int。
有没有不使用对象属性的快速方法来获取相同的输出?
除了var_dump(),我通过反复试验发现debug_zval_dump()也输出对象实例,不幸的是它还需要输出缓冲,因为它不返回结果。
【问题讨论】:
-
不,这不是任何资源的“实例 ID”,而是将资源 ID 转换为整数 - 这根本不是一回事。
-
@symcbean:你似乎注意到了引号......这个问题仍然有效,没有理由反对。
-
@Alix:好的,请注意使用我偶然发现的唯一对象 ID:mail-archive.com/internals@lists.php.net/msg28779.html
-
@Martin:谢谢!这条评论mail-archive.com/internals@lists.php.net/msg28820.html 让我仔细检查
spl_object_hash确实产生了差异!然而,一个非常微妙的:0000000079e5f3b60000000042b31773和0000000079e5f3b50000000042b31773,例如。这主要解决了我的需求! :) -
从 php 7.2.0 开始存在内置函数 spl_object_id:php.net/manual/de/function.spl-object-id.php
标签: php class object resources instance