【问题标题】:Difference between "use" and passing a parameter to controller function“使用”和将参数传递给控制器​​功能之间的区别
【发布时间】:2013-03-28 22:58:10
【问题描述】:

我没有具体的问题,只是想加深我对 Silex 以及一些新的 PHP 特性的理解。这是基于 Silex 文档的“使用”页面上的代码示例:

$blogPosts = array(
    1 => array(
        'date'      => '2011-03-29',
        'author'    => 'igorw',
        'title'     => 'Using Silex',
        'body'      => '...',    );

$app->get('/blog/{id}', function (Silex\Application $app, $id) use ($blogPosts) {
    //do stuff
}

问题

  • $app$id 作为参数 传递给函数和使用-ing $blogPosts 变量之间有什么区别?

  • $blogPosts 是否也可以作为参数传递给函数?

  • 另外,我更常看到use ($app)使用-ing $app 和传递它是一个参数有什么区别?

【问题讨论】:

    标签: php closures anonymous-function silex


    【解决方案1】:

    这与 silex 无关,而与“一些新的 PHP 特性”有关。 您正在创建一个匿名函数(也称为闭包),可多次使用不同的 $app$id 值,但只有相同的 $blogPosts 值。

    <?php
    $a = "a";
    $b = "b";
    $c = function ($d) use ($b) {
        echo $d . "." . $b . PHP_EOL;
    };
    $b = "c";
    $e = function ($d) use ($b) {
        echo $d . "." . $b . PHP_EOL;
    };
    
    $c($a); // prints a.b, and not a.c
    $e($a); // prints a.c
    

    在这里,我正在使用 $b 构建一个函数,一旦构建完成,我就可以将它与不必以与函数参数命名相同的方式命名的变量一起使用。

    【讨论】:

    • 仍在尝试解决这个问题,但您的示例绝对有帮助。有趣的是,“use”将引用在use语句声明时存在的$b的值,而不关心包含“use”语句的函数何时称为。所以“使用”类型为它所附加的闭包定义了一个环境。我假设如果在$b="c"; 下放置另一个函数$e = function ($f) use ($b) { //same stuff };,那么调用$e($a) 将打印出“a.c.”。我明白了吗?
    • 很好的答案,但不是很好,因为它没有解决所有 OP 的问题。 OP 有几个重要的问题...
    • 如果您愿意,您可以提交对此答案的更改
    【解决方案2】:

    也许这会让它更透明

    <?php
    $a = "a1";
    $b = "b1";
    $f = function ($x) use ($b) {
        echo $x . $b;
    };
    $f($a); // prints a1b1
    
    // now let's change values of $a and $b
    $a = "a2";
    $b = "b2"; //--> won't be used as $b was 'b1' when declaring the function.
    $f($a); // prints a2b1
    ?>
    

    【讨论】:

      【解决方案3】:

      使用允许将变量从父作用域导入闭包作用域。

      它将允许函数 get() 使用从父作用域导入的适当参数 $blogPosts 调用您的闭包。

      【讨论】:

        猜你喜欢
        • 2019-12-27
        • 2013-08-12
        • 2016-03-07
        • 1970-01-01
        • 2021-12-15
        • 2018-07-14
        • 1970-01-01
        • 2016-03-02
        相关资源
        最近更新 更多