Php 超薄保护可调用项

Php 超薄保护可调用项,php,function,closures,slim,php-closures,Php,Function,Closures,Slim,Php Closures,在Slim框架中,有一个protect函数,它将可调用项包装在一个函数中(即另一个可调用项)。中的描述说: 如果您希望将闭包存储为原始值,而不调用它,该怎么办?您可以这样做: $app->myClosure = $app->container->protect(function () {}); 查看源代码,我看到以下内容: /** * Protect closure from being directly invoked * @param Closure $callab

在Slim框架中,有一个
protect
函数,它将可调用项包装在一个函数中(即另一个可调用项)。中的描述说:

如果您希望将闭包存储为原始值,而不调用它,该怎么办?您可以这样做:

$app->myClosure = $app->container->protect(function () {});
查看源代码,我看到以下内容:

/**
 * Protect closure from being directly invoked
 * @param  Closure $callable A closure to keep from being invoked and evaluated
 * @return Closure
 */
public function protect(\Closure $callable)
{
    return function () use ($callable) {
        return $callable;
    };
}
我想知道这有什么意义。在这里,我做了自己的测试:

$foo = function() {
    echo "Hello";
};

$bar = function () use ($foo) {
    return $foo;
};

var_dump($foo);
var_dump($bar);
这就是我得到的:

object(Closure)#1 (0) {
}
object(Closure)#2 (1) {
  ["static"]=>
  array(1) {
    ["foo"]=>
    object(Closure)#1 (0) {
    }
  }
}

我可以调用
$bar()
来返回可调用项,但是如果我可以使用
$foo
,为什么要这样做呢?有人能解释一下它的用途吗?

这都是关于在运行时调用闭包的。当您需要使用回调(将闭包作为可调用的
\closure
传递给另一个函数)而不立即调用它时,这一点就变得很明显了

让我们看看苗条跑步中发生了什么

因此,如果我们简单地给一个资源分配一个闭包,就像这样

$app->foo = function () {
    return 'invoked foo returns this string';
};
或者作为Slims单例资源

$app->container->singleton('foo', function () {
    return 'invoked foo returns this string';
});
它将分别在每次调用或第一次调用时调用。。。所以

$app->foo;
将返回被调用的字符串
,foo将返回该字符串

假设我们希望另一个函数使用我们的可调用函数(作为某种中间层),并希望使用
call\u user\u function()
调用它。因此,我们不希望传入调用的函数(它将传递返回值),而是传入一个未调用的闭包,我们通过使用
protect()
方法将闭包分配给变量/资源来实现

$app->bar = $app->container->protect(function () {
    return 'bar returns a callable closure';
});
为了演示,让我们将
$app->foo
$app->bar
传递到
调用用户函数()

将抛出一个错误

"call_user_func() expects parameter 1 to be a valid callback,
 function 'invoked foo returns this string' not found or invalid function name"
因为它试图调用返回的字符串,其中

call_user_func($app->bar);
调用保存在
$app->bar
中的闭包并返回其返回字符串,如下所示:

"bar returns a callable closure"
我希望这个例子能够说明Slim的
protect()
方法的有用性

"bar returns a callable closure"