我不久前在 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 类资源似乎不适用于对象:
Notice: Object of class foo could not be converted to int.
有没有不使用对象属性的快速方法来获取相同的输出?
除了var_dump()
,我通过反复试验发现debug_zval_dump()
还输出对象实例,不幸的是它还需要输出缓冲,因为它不返回结果。
最佳答案
spl_object_hash()
可以在这里帮助你。它
returns a unique identifier for the object
对于给定的实例,它总是相同的。
EDIT 在 OP 评论之后:
您可以使用静态类属性实现这样的行为,例如:
class MyClass
{
private static $_initialized = false;
public function __construct()
{
if (!self::$_initialized) {
self::$_initialized = true;
// your run-only-once code
}
}
}
但实际上这与您的原始问题无关。
关于php - 在 PHP 中获取对象的实例 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2872366/