Slim 保护可调用对象
Slim protect callables
在 Slim Framework 中,有一个 protect
函数将可调用项包装在一个函数中(即另一个可调用项)。 the manual中的描述说:
What if you want to literally store a closure as the raw value and not have it invoked? You can do that like this:
$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()
调用到 return 可调用对象,但如果我只能使用 $foo
,我为什么要这样做?有人可以解释一下这样做的目的吗?
这都是关于在 运行 时间调用闭包。当您需要使用回调(将闭包作为可调用 \Closure
传递给另一个函数)而不立即调用它时,这一点就变得很明显了。
让我们看看我们的 Slim 内部发生了什么 运行。
所以如果我们简单地为资源分配一个闭包,就像这样
$app->foo = function () {
return 'invoked foo returns this string';
};
或作为 Slims 单例资源
$app->container->singleton('foo', function () {
return 'invoked foo returns this string';
});
它将分别在每次调用或我们第一次调用它时被调用...所以
$app->foo;
将return字符串invoked foo returns this string
.
假设我们希望另一个函数使用我们的可调用对象(作为某种中间层)并希望使用 call_user_function()
调用它。所以我们不想传递被调用的函数(它将传递 returned 值),而是传递一个未调用的闭包,我们通过使用 variable/resource 将闭包分配给 variable/resource 来实现=21=]方法
$app->bar = $app->container->protect(function () {
return 'bar returns a callable closure';
});
为了演示,让我们将 $app->foo
和 $app->bar
传递给 call_user_function()
:
call_user_func($app->foo);
会抛出错误
"call_user_func() expects parameter 1 to be a valid callback,
function 'invoked foo returns this string' not found or invalid function name"
因为它试图调用 returned 字符串,其中
call_user_func($app->bar);
调用保存在 $app->bar
中的闭包和 return 其 return 字符串,如下所示:
"bar returns a callable closure"
我希望这个例子能说明 Slim 的 protect()
方法的实用性。
在 Slim Framework 中,有一个 protect
函数将可调用项包装在一个函数中(即另一个可调用项)。 the manual中的描述说:
What if you want to literally store a closure as the raw value and not have it invoked? You can do that like this:
$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()
调用到 return 可调用对象,但如果我只能使用 $foo
,我为什么要这样做?有人可以解释一下这样做的目的吗?
这都是关于在 运行 时间调用闭包。当您需要使用回调(将闭包作为可调用 \Closure
传递给另一个函数)而不立即调用它时,这一点就变得很明显了。
让我们看看我们的 Slim 内部发生了什么 运行。
所以如果我们简单地为资源分配一个闭包,就像这样
$app->foo = function () {
return 'invoked foo returns this string';
};
或作为 Slims 单例资源
$app->container->singleton('foo', function () {
return 'invoked foo returns this string';
});
它将分别在每次调用或我们第一次调用它时被调用...所以
$app->foo;
将return字符串invoked foo returns this string
.
假设我们希望另一个函数使用我们的可调用对象(作为某种中间层)并希望使用 call_user_function()
调用它。所以我们不想传递被调用的函数(它将传递 returned 值),而是传递一个未调用的闭包,我们通过使用 variable/resource 将闭包分配给 variable/resource 来实现=21=]方法
$app->bar = $app->container->protect(function () {
return 'bar returns a callable closure';
});
为了演示,让我们将 $app->foo
和 $app->bar
传递给 call_user_function()
:
call_user_func($app->foo);
会抛出错误
"call_user_func() expects parameter 1 to be a valid callback,
function 'invoked foo returns this string' not found or invalid function name"
因为它试图调用 returned 字符串,其中
call_user_func($app->bar);
调用保存在 $app->bar
中的闭包和 return 其 return 字符串,如下所示:
"bar returns a callable closure"
我希望这个例子能说明 Slim 的 protect()
方法的实用性。