如何"请求 - > getBody"工作苗条

时间:2015-10-28 16:54:57

标签: php functional-programming slim

如果我发帖,我可以通过$payload = json_decode($app->request->getBody());

获取内容

但我无法理解request->getBody在苗条中是如何运作的。

首先,这是一种神奇的方法:

public function __get($name)
{
    return $this->container->get($name);
}

这将返回一个Slim \ Http \ Request对象。那现在很好。

$this->container是Slim \ Helper \ Set,这是get函数:

public function get($key, $default = null)
{
    if ($this->has($key)) {
        $isInvokable = is_object($this->data[$this->normalizeKey($key)]) && method_exists($this->data[$this->normalizeKey($key)], '__invoke');

        return $isInvokable ? $this->data[$this->normalizeKey($key)]($this) : $this->data[$this->normalizeKey($key)];
    }

    return $default;
}

$this->data[$this->normalizeKey($key)]$this->data['request']相同,属于类型"关闭" (不确定理解这一点)。

$isInvokable是真的,所以这叫做:

$this->data[$this->normalizeKey($key)]($this)

这条线做什么?为什么($this)(Slim \ Helper \ Set)在最后?

特别是,为什么要调用的下一个函数是:

public function singleton($key, $value)
{
    $this->set($key, function ($c) use ($value) {
        static $object;

        if (null === $object) {
            $object = $value($c);
        }

        return $object;
    });
}

为什么singleton($key, $value)? 它从未被称为! $ key未在函数开头定义。还有什么让$ c成为Slim \ Helper \ Set,而$值是一个闭包?

为什么只执行static $object会使$对象从单位化变为Slim \ Http \ Request类型之一?

2 个答案:

答案 0 :(得分:0)

免责声明:我不熟悉Slim。我只是按照你发布的内容去做。

好吧,Set->get()方法测试,如果可以调用data属性数组中带有键$key的值,然后执行,如果为真。

因此$this->data[$this->normalizeKey($key)]($this)正在调用以$this为参数的方法,然后Set->get()返回该方法的返回值。

闭包通常也称为“anonymous function”,这是PHP 5.3中的一个新功能。自PHP 5.4以来,可以使用数组variable to call a function

它允许您将函数/方法作为值传递,这可以说是functional programming中的 区别特征。

答案 1 :(得分:0)

在初始化之前调用函数singleton。

将所有$键设置为函数。

所以,$this->data[$this->normalizeKey($key)]($this)就是那个功能!