[英]Slim protect callables
在Slim Framework中,有一個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
傳遞給另一個函數)而無需立即調用它時,這一點很明顯。
讓我們看看Slim運行期間發生了什么。
因此,如果我們只是將閉包分配給資源,就像這樣
$app->foo = function () {
return 'invoked foo returns this string';
};
或作為Slims單身人士資源
$app->container->singleton('foo', function () {
return 'invoked foo returns this string';
});
它將分別在每次調用或第一次調用時被調用...所以
$app->foo;
將返回被invoked foo returns this string
的字符串invoked foo returns this string
。
假設我們希望另一個函數使用我們的callable(作為某種中間層),並希望通過call_user_function()
調用它。 因此,我們不想傳入被調用的函數(它將傳遞返回的值),而是傳入未調用的閉包,這是通過使用protect()
方法將閉包分配給變量/資源來實現的
$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"
因為它嘗試調用返回的字符串,其中
call_user_func($app->bar);
調用保存在$app->bar
的閉包,並返回其返回字符串,如下所示:
"bar returns a callable closure"
我希望該示例說明Slim的protect()
方法的有用性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.