Как найти идентификатор объекта в PHP? - PullRequest
46 голосов
/ 21 ноября 2008

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

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

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

Ответы [ 4 ]

82 голосов
/ 21 ноября 2008

Используйте spl_object_hash() для этого.

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

Edit:

Для пользователей PHP <5.2.x см. <a href="https://stackoverflow.com/a/19250740/179104"> этот ответ .

15 голосов
/ 13 июня 2011

В настоящее время нет способа сделать это в PHP, начиная с версии 5.3.6.

spl_object_hash () не делает то, что вам нужно - поскольку он перезагружает идентификаторы при удалении объектов, это приведет к ошибкам (например) объектно-реляционного преобразователя, пытающегося отслеживать объекты в сеансе.

Описание в верхней части страницы документации («Эта функция возвращает уникальный идентификатор для объекта. Этот идентификатор может использоваться в качестве хэш-ключа для хранения объектов или для идентификации объекта.») Неверно - правда в том, что раскрывается в примечании на этой странице: «Когда объект уничтожен, его хэш может быть повторно использован для других объектов», или, другими словами, функция не всегда возвращает уникальный идентификатор и может не всегда используется для хранения или идентификации объектов.

Техника, продемонстрированная в в этом комментарии , может работать в некоторых случаях, но она ненадежна и не будет работать согласованно, поскольку попытка доступа к неопределенному свойству вызовет магию __get () и __set () методы, результаты которых непредсказуемы.

В заключение, краткий ответ на ваш вопрос (к сожалению) «нет» - в PHP нет такого метода, и нет способа написать такой метод, который будет последовательно работать для любого объекта.

Если вы хотите, чтобы эта функция была добавлена ​​в PHP, пожалуйста, проголосуйте и / или прокомментируйте здесь:

http://bugs.php.net/bug.php?id=52657

0 голосов
/ 10 мая 2019

⚠️ PHP 7.2.0 вводит spl_object_id () !

$test = (object)[];
var_dump(spl_object_id($test)); # int(1)
Предостережение emptor (?) :

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

0 голосов
/ 05 января 2016

Я знаю, что это старая тема, но я думаю, что нашел решение.

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

<?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
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...