Pimple 是一个简单的 php 依赖注入容器,用于 silex 框架。我在这里浏览了源代码。在文档中,该函数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 的不同调用返回相同的实例。它不会每次都返回一个新实例吗?请帮我。我尝试了很多,但我不明白。