Pimple は、silex フレームワークで使用される php の単純な依存性注入コンテナーです。ここでソースコードを調べていました。ドキュメントでは、関数offsetGet
は依存関係コンテナーにアタッチされているクラスの同じインスタンスを返します。関連するコードoffsetGet
は次のとおりです。
public function offsetGet($id)
{
if (!isset($this->keys[$id])) {
throw new InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id));
}
if (
isset($this->raw[$id])
|| !is_object($this->values[$id])
|| isset($this->protected[$this->values[$id]])
|| !method_exists($this->values[$id], '__invoke')
) {
return $this->values[$id];
}
if (isset($this->factories[$this->values[$id]])) {
return $this->values[$id]($this);
}
$this->frozen[$id] = true;
$this->raw[$id] = $this->values[$id];
return $this->values[$id] = $this->values[$id]($this);
}
ここで、オブジェクトがfactories
Object Store( SplObjectStorage
type) にある場合、id $id を持つクラスの新しいインスタンスを返します。次に、最後のリターンで再び$this->values[$id]
オブジェクトの新しいインスタンスに設定され、その新しいインスタンスが返されます。
return $this->values[$id] = $this->values[$id]($this)
.
これは私が理解できない行です。この行はoffsetGet
、同じ $id の異なる呼び出しに対して同じインスタンスを返すことになっています。毎回新しいインスタンスを返しませんか? 私を助けてください。いろいろ試しましたがわかりません。