Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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
可变分辨率PHP_Php_Oop_Inversion Of Control_Slim - Fatal编程技术网

可变分辨率PHP

可变分辨率PHP,php,oop,inversion-of-control,slim,Php,Oop,Inversion Of Control,Slim,这是Slim框架的一个片段。我试图理解$c值是如何设置的。我执行了一个错误\u log(),它是一个类型Slim\Helper\Set,它是一个单例 public function __construct(array $userSettings = array()) { // Setup IoC container $this->container = new \Slim\Helper\Set(); $this->container['settings'] =

这是Slim框架的一个片段。我试图理解$c值是如何设置的。我执行了一个错误\u log(),它是一个类型Slim\Helper\Set,它是一个单例

public function __construct(array $userSettings = array())
{
    // Setup IoC container
    $this->container = new \Slim\Helper\Set();
    $this->container['settings'] = array_merge(static::getDefaultSettings(), $userSettings);

    // Default environment
    $this->container->singleton('environment', function ($c) {
        return \Slim\Environment::getInstance();
    });

    // Default request
    $this->container->singleton('request', function ($c) {
        return new \Slim\Http\Request($c['environment']);
    });
    .... snip 
}

我在青春痘网站上看到了一个类似的例子

如何设置$c?它不是一个全局变量

谢谢 K

让我们来分析一下

$this->container->singleton('environment', function ($c) {
    return \Slim\Environment::getInstance();
});
他们在传递两个论点。第一个是字符串
environment
,它可能指示函数实例化什么类型的类(我的猜测得到了支持)。第二个参数(其中
$c
是)是一个匿名函数

基于
Slim\Set

所以你调用了这个函数
$value
是一个可调用(函数)。您可以看到在此行中设置了
$c

$object = $value($c);

在Slim和Pimple中,$c参数是Pimple容器对象

/**
 * Ensure a value or object will remain globally unique
 * @param  string   $key   The value or object name
 * @param  \Closure $value The closure that defines the object
 * @return mixed
 */    
public function singleton($key, $value)
{
    $this->set($key, function ($c) use ($value) {
        static $object;
        if (null === $object) {
            $object = $value($c);
        }
        return $object;
    });
}
$object = $value($c);