Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解pimple php源代码_Php_Dependency Injection_Lambda_Pimple - Fatal编程技术网

了解pimple php源代码

了解pimple php源代码,php,dependency-injection,lambda,pimple,Php,Dependency Injection,Lambda,Pimple,Pimple是在silex框架中使用的php中的一个简单依赖项注入容器。我正在浏览源代码。在文档中,函数offsetGet返回附加到依赖项容器的类的相同实例。offsetGet的相关代码为: public function offsetGet($id) { if (!isset($this->keys[$id])) { throw new InvalidArgumentException(sprintf('Identifier "%s" is not defined

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);
 }
这里,如果对象位于
工厂
对象存储区(
SplObjectStorage
类型),它将返回id为$id的类的新实例。然后在最后一次返回中,再次将
$this->values[$id]
设置为对象的新实例,并返回该新实例

返回$this->values[$id]=$this->values[$id]($this)

这是我听不懂的台词。对于同一$id的不同调用
offsetGet
,此行如何返回同一实例。它不是每次都返回一个新实例吗?
请帮帮我。我试了很多,但都不明白

我查看了pimple的源代码,发现一旦对象被实例化并保存在
$this->values[$id]
中,下一次调用
offsetGet
将从第二个
if
条件返回。 i、 e此
如果
条件:

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];
}
查看单元测试,我发现没有magic方法
\uuu invoke
的对象可以共享。如果对象有一个神奇的方法
\uu invoke
(即可以将对象视为函数),则每次都会返回一个新实例。
因此,您可以看到上面if语句的第一、第二和第三个条件返回false。但是第四个条件返回true,因此,
$this->values[$id]
每次都返回相同的实例。

$this
只注入对象,该对象在之前实例化过,而不是在返回时。我知道传递$this是因为匿名函数需要容器的对象。这个匿名函数返回类的一个新实例。那么实例是否与id相关?tbh我没有使用这个libyes它们与id相关。那么使用同一个实例有什么问题呢。据我所知,您担心它是否每次都返回新实例。那么答案应该是否定的,除非传递了不同的id?