Как найти идентификатор объекта в PHP?
Я использую PHP 5.2. Я хотел бы найти способ вывода уникального идентификатора для каждого объекта, поэтому при просмотре журналов легко увидеть, какие объекты одинаковы.
В Ruby я просто скажу object.object_id, чтобы получить внутренний идентификатор Ruby для объекта. Кажется, что нет очевидного способа сделать это в PHP.
Есть ли встроенный способ сделать это? Если нет, можете ли вы предложить другие предложения?
Ответы
Ответ 1
Используйте для этого spl_object_hash()
.
Он возвращает уникальный идентификатор для каждого экземпляра объекта, а не имя класса, поэтому он кажется более подходящим для вас.
Редактировать:
Для пользователей PHP <5.2.x посмотрите этот ответ.
Ответ 2
В настоящее время нет способа сделать это в PHP, начиная с версии 5.3.6.
spl_object_hash() не делает то, что вы хотите - поскольку он перерабатывает идентификаторы, когда объекты удаляются, это приведет к ошибкам (например) объектно-реляционного картографа, пытающегося отслеживать объекты в сеансе.
Описание в верхней части страницы документации ( "Эта функция возвращает уникальный идентификатор объекта. Этот идентификатор может использоваться как хэш-ключ для хранения объектов или для идентификации объекта".) неверно - правда в примечании на этой странице: "Когда объект уничтожен, его хэш может быть повторно использован для других объектов", или, другими словами, функция не всегда возвращает уникальный идентификатор и не всегда может использоваться для хранения или идентификации объекты.
Метод, продемонстрированный в этом комментарии, может работать в некоторых случаях, но он не является надежным и не будет работать последовательно, поскольку попытка доступа к свойству undefined будет вызывать магические методы __get() и __set(), результаты которых непредсказуемы.
В заключение, короткий ответ на ваш вопрос (к сожалению) "нет" - такого метода в PHP нет, и нет способа написать такой метод, который будет работать последовательно для любого объекта.
Если вы хотите, чтобы эта функция была добавлена в PHP, проголосуйте и/или прокомментируйте здесь:
http://bugs.php.net/bug.php?id=52657
Ответ 3
Я знаю, что это старая тема, но я думаю, что нашел решение.
Хитрость заключается в хранении ссылки на каждый объект в массиве с назначенным ключом.
Затем вы можете получить идентификатор объекта, выполнив поиск по этому массиву и вернув найденный ключ.
<?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
*/
Ответ 4
$test = (object)[];
var_dump(spl_object_id($test)); # int(1)
Будьте бдительны (?): Когда объект уничтожен, его идентификатор может быть повторно использован для других объектов.