52

PHP5.2を使用しています。オブジェクトごとに一意のIDを出力する方法を見つけたいので、ログを調べて同じオブジェクトを簡単に確認できます。

Rubyでは、object.object_idと言うだけで、オブジェクトのRubyの内部識別子を取得できます。PHPでこれを行うための明白な方法はないようです。

これを行うための組み込みの方法はありますか?ない場合は、他に何か提案はありますか?

4

4 に答える 4

84

そのために使用spl_object_hash()します。

クラスの名前ではなく、オブジェクトインスタンスごとに一意の識別子を返すため、より適しているようです。

編集:

PHP <5.2.xユーザーの場合は、この回答を参照してください。

于 2008-11-21T07:46:58.100 に答える
16

バージョン 5.3.6 の現在、PHP でこれを行う方法はありません。

spl_object_hash() はあなたが望むことをしません - オブジェクトが削除されたときに識別子をリサイクルするため、(たとえば) セッション内のオブジェクトを追跡しようとするオブジェクトリレーショナルマッパーでエラーが発生します。

ドキュメント ページの上部にある説明 (「この関数は、オブジェクトの一意の識別子を返します。この ID は、オブジェクトを格納するため、またはオブジェクトを識別するためのハッシュ キーとして使用できます。」) は間違っています。真実は、そのページのメモ:「オブジェクトが破棄されると、そのハッシュは他のオブジェクトに再利用される可能性があります」、つまり、関数は常に一意の識別子を返すとは限ら、オブジェクトの格納または識別に常に使用できるとは限りません。

このコメントで示されている手法は場合によっては機能する可能性がありますが、未定義のプロパティにアクセスしようとすると __get() および __set() マジック メソッドが呼び出され、その結果が予測できないため、信頼性が低く、一貫して機能しません。

結論として、あなたの質問に対する短い答えは (残念ながら) 「いいえ」です。PHP にはそのようなメソッドはなく、どのオブジェクトに対しても一貫して機能するこのようなメソッドを作成する方法はありません。

この機能を PHP に追加することを希望する場合は、ここで投票および/またはコメントしてください。

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

于 2011-06-13T12:50:12.030 に答える
0

これは古いトピックであることは知っていますが、解決策を見つけたと思います。

秘訣は、割り当てられたキーを使用して各オブジェクトへの参照を配列に格納することです。次に、その配列を検索して見つかったキーを返すことにより、オブジェクト ID を取得できます。

<?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
*/
于 2016-01-04T21:06:23.077 に答える