Подтвердить что ты не робот

Как найти идентификатор объекта в PHP?

Я использую PHP 5.2. Я хотел бы найти способ вывода уникального идентификатора для каждого объекта, поэтому при просмотре журналов легко увидеть, какие объекты одинаковы.

В Ruby я просто скажу object.object_id, чтобы получить внутренний идентификатор Ruby для объекта. Кажется, что нет очевидного способа сделать это в PHP.

Есть ли встроенный способ сделать это? Если нет, можете ли вы предложить другие предложения?

4b9b3361

Ответ 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

⚠️ В PHP 7.2.0 теперь есть spl_object_id() !

$test = (object)[];
var_dump(spl_object_id($test)); # int(1)
Будьте бдительны (?):

Когда объект уничтожен, его идентификатор может быть повторно использован для других объектов.