これは設計上の問題を引き起こすに違いありませんが、PHP でクロージャーをシリアル化またはハッシュして、そのクロージャーの一意の識別子を取得したいと考えています。
そこからクロージャーを呼び出す必要はありません。クロージャー自体の内外からアクセスできる一意の識別子が必要なだけです。つまり、クローザーを受け入れるメソッドは、その ID を生成する必要があります。クロージャーであり、クロージャー自体が同じ ID を生成できる必要があります。
私がこれまでに試したこと:
$someClass = new SomeClass();
$closure1 = $someClass->closure();
print $closure1();
// Outputs: I am a closure: {closure}
print $someClass->closure();
// Outputs: Catchable fatal error: Object of class Closure could not be converted to string
print serialize($closure1);
// Outputs: Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed'
class SomeClass
{
function closure()
{
return function () { return 'I am a closure: ' . __FUNCTION__; };
}
}
Reflection API も、ID の作成に使用できるものを提供していないようです。