簡體   English   中英

超薄保護可調用對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM