Недавно я узнал о StackOverflow, что мы можем получить "идентификатор экземпляра" любого ресурса, например:
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()
также выводит экземпляр объекта, к сожалению, он также нуждается в буферизация вывода, поскольку она не возвращает результат.