web-dev-qa-db-fra.com

Comment trouver l'ID d'objet en PHP?

J'utilise PHP 5.2. Je voudrais trouver un moyen de générer un identifiant unique pour chaque objet, il est donc facile de parcourir les journaux pour voir quels objets sont les mêmes.

Dans Ruby, je dirais juste object.object_id pour obtenir l'identifiant interne de Ruby pour l'objet. Il ne semble pas y avoir de moyen évident de le faire en PHP.

Existe-t-il une manière intégrée de procéder? Si ce n'est pas le cas, pouvez-vous proposer d'autres suggestions?

46
Joel

Utilisez spl_object_hash() pour cela.

Il renvoie un identifiant unique pour chaque instance d'objet, et non le nom de la classe, il semble donc plus approprié pour vous.

Modifier:

Pour PHP <utilisateurs 5.2.x, voir cette réponse .

82
azkotoki

Il n'y a actuellement aucun moyen de le faire en PHP, à partir de la version 5.3.6.

spl_object_hash () ne fait pas ce que vous voulez - car il recycle les identificateurs lorsque les objets sont supprimés, cela entraînera des erreurs dans (par exemple) un mappeur relationnel-objet essayant de garder une trace des objets dans une session.

La description en haut de la page de documentation ("Cette fonction renvoie un identifiant unique pour l'objet. Cet identifiant peut être utilisé comme clé de hachage pour stocker des objets ou pour identifier un objet.") Est erronée - la vérité est révélée dans le note sur cette page: "Lorsqu'un objet est détruit, son hachage peut être réutilisé pour d'autres objets", ou en d'autres termes, la fonction ne pas toujours retourne un identifiant unique et ne peut pas toujours être utilisé pour stocker ou identifier des objets.

La technique illustrée dans ce commentaire peut fonctionner dans certains cas, mais elle n'est pas fiable et ne fonctionnera pas non plus de manière cohérente, car tenter d'accéder à une propriété non définie invoquera les méthodes magiques __get () et __set (), dont les résultats sont imprévisibles.

En conclusion, la réponse courte à votre question (malheureusement) est "non" - il n'y a pas une telle méthode en PHP, et il n'y a aucun moyen d'écrire une méthode comme celle-ci qui fonctionnera de manière cohérente pour n'importe quel objet.

Si vous souhaitez voir cette fonctionnalité ajoutée à PHP, veuillez voter et/ou commenter ici:

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

15
mindplay.dk

Je sais que c'est un vieux sujet, mais je pense avoir trouvé une solution.

L'astuce consiste à stocker la référence à chaque objet dans le tableau avec la clé affectée. Vous pouvez ensuite obtenir l'ID de l'objet en recherchant dans ce tableau et en retournant la clé trouvée.

<?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
*/
0
rolacja