2016-03-20 10 views
1

私はfactory method of Pimpleを使用していますが、毎回同じインスタンスが返されます。Pimpleファクトリメソッドが同じインスタンスを返すのはなぜですか?

$container = new \Pimple\Container(); 

echo '<pre>'; 

$container['test'] = $container->factory(function($c) { 
    $services = new \Pimple\Container(); 

    return $services; 
}); 

// Both outputs string(32) "0000000061066681000000005c9b6294" 
var_dump(spl_object_hash($container['test'])); 
var_dump(spl_object_hash($container['test'])); 

メソッドの定義が毎回新しいインスタンスを与えるとは限りません。

私はPHP 7.0.4上だとニキビのための私の作曲ファイルは^3.0.0

+0

。だから、本当にそれはメジャーバージョンのリリースになることができます...私は最初にPimpleで2.8にロールしようとしています –

+0

@ RyanVincentは別のバージョンにいますか? https://github.com/silexphp/Pimple/releases –

+0

申し訳ありませんが、最新のバージョンはPHP 5.3と互換性があります:https://github.com/silexphp/Pimpleを使用しています。テストプログラムの出力は次のとおりです。http://pastebin.com/Zs3879Bc –

答えて

0

にきびが同じインスタンスを返さないでマークされているが、一部の知ら理由でこれらのハッシュはまったく同じです。これは、Pimpleに関連するものではなく、spl_object_hashに関連し、PHPが内部的にオブジェクトを処理する方法に関連しています。 this user contributed noteを引用し、あなたの質問に答える部分は太字である:オブジェクトの内容(プロパティ)は 関数でハッシュ化されていないことを

注意、単にその内部のハンドルとハンドラテーブルのポインタ。 これは、メモリ内に共存する2つのオブジェクトが同時に異なるハッシュを持つことを保証するのに十分です。一意性は、例えば、同時にメモリ に存在していなかったオブジェクト間で保証 ない:

のvar_dump(spl_object_hash(新はstdClass())、spl_object_hash(新しい はstdClass()))。それは は逆参照し、それが第二はstdClassを作成する際に破壊された後、PHP は、最初はstdClassための内部ハンドルを再利用するため、

単独でこれを実行すると、通常は、同じハッシュを生成します。

これは、返されたオブジェクトへの参照を保持していないためです。あなたはそれらを作成し、ハッシュを印刷してから、PHPがそれらをメモリから取り除きます。このノートをよりよく理解するために、変数($ref1、ここ$ref2)に割り当てることで、メモリにそれらのインスタンスを維持しよう:

$container = new \Pimple\Container(); 

$container['test'] = $container->factory(function($c) { 
    $services = new \Pimple\Container(); 

    return $services; 
}); 

// Outputs different object hashes 
print(spl_object_hash($ref1 = $container['test'])); 
print "\n"; 

print(spl_object_hash($ref2 = $container['test'])); 
print "\n"; 
上記のバージョンを更新しました
関連する問題