【问题标题】:What is the difference between anonymous function and anonymous function with use in Php ? [duplicate]匿名函数和在 PHP 中使用的匿名函数有什么区别? [复制]
【发布时间】:2017-09-28 19:33:43
【问题描述】:

我最近浏览了这些匿名函数的例子,但我不是很清楚,它们之间有什么区别,为什么在第二个函数中 use keyword 使用过,为什么第一个返回 null 而第二个返回 0:

<?php
$result = 0;

// first function
$one = function()
{ var_dump($result); };

// second function with use
$two = function() use ($result)
{ var_dump($result); };

$three = function() use (&$result)
{ var_dump($result); };


$result++;

$one();    // outputs NULL: $result is not in scope
$two();    // outputs int(0): $result was copied
$three();    // outputs int(1)
?>

参考链接:http://php.net/manual/en/functions.anonymous.php

【问题讨论】:

  • 您是否尝试运行您的示例?
  • 通知是否被禁用?如果是这样,请激活它们以进行测试。 use 允许您引用或使用匿名函数范围之外的变量。话虽如此,匿名函数有自己的范围(包括一些超级全局变量)。这意味着您无法访问此范围之外的任何内容。所以,如果你不声明它,你的变量将在 anon func 的范围内使用,因此它是NULL(如果你打开了通知,你会收到通知)。直接访问$result 将允许您使用,但不能修改$result&amp;$result 传递引用。
  • 是的!我尝试了与提及相同的结果。

标签: php


【解决方案1】:

这会发出 Notice: Undefined variable 并返回 NULL,因为 $result 不在函数的范围内,就像任何函数一样:

// first function
$one = function()
{ var_dump($result); };

这会将$result 的值导入匿名函数。此时的值为0,因此$two 访问的函数将始终使用0 代替$result

// second function with use
$two = function() use ($result)
{ var_dump($result); };

这个使用$result作为对实际$result变量的引用,所以当它在函数调用之前递增时,它是1。这也允许您在函数内更改$result

$three = function() use (&$result)
{ var_dump($result); };

将变量放入函数的另一种方法是将其定义为接受参数并将其传入:

$one = function($var)
{ var_dump($var); };

$one($result);

或参考:

$one = function(&$var)
{ var_dump($var); };

$one($result);

【讨论】:

    【解决方案2】:

        // first function
    $one = function()
    { var_dump($result); 
    };
    

    必须返回一个通知未定义变量...如果在 php.ini 中通知被禁用返回 null

    // second function with use
    $two = function() use ($result)
    { var_dump($result); };
    

    返回 $result = 0

    你增加 $result++;

    $three = function() use (&$result)
    { var_dump($result); };
    

    返回 0+1 = 1;

    【讨论】:

      【解决方案3】:

      来自您发布的链接

      闭包也可以从父作用域继承变量。 任何此类变量都必须传递给使用语言构造。从 PHP 7.1 开始,这些变量不得包含超全局变量、$this 或与参数同名的变量。

      因此,如果您想使用函数外部的变量,请通过 use 构造传递它们。

      【讨论】:

        猜你喜欢
        • 2021-12-12
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多