web-dev-qa-db-ja.com

PHPでオブジェクトIDを見つける方法は?

PHP 5.2を使用しています。すべてのオブジェクトに一意のIDを出力する方法を見つけたいので、ログを調べてどのオブジェクトが同じであるかを確認するのは簡単です。

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

これを行う組み込みの方法はありますか?ない場合は、他の提案を提供できますか?

46
Joel

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

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

編集:

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

82
azkotoki

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

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

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

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

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

この機能をPHPに追加したい場合は、ここで投票またはコメントしてください。

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

15
mindplay.dk

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

秘訣は、割り当てられたキーを使用して、各オブジェクトへの参照を配列に格納することです。次に、その配列を検索して、見つかったキーを返すことにより、オブジェクト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
*/
0
rolacja