【问题标题】:Is passing variables to php anonymus function without use legit?是否在不使用合法的情况下将变量传递给 php 匿名函数?
【发布时间】:2021-11-27 16:34:43
【问题描述】:

刚刚学习了php匿名函数,发现下面的代码是正确的:

示例 1:

//$mysqli = new mysqli(...)
(function($x, $y, $conn) {
  echo $x, $y; //$x and $y are not visible outside
})(786, 333, $mysqli);

在网上我找到了类似的例子

示例 2:

$x = 786; $y = 333;
(function($x, $y) {
  echo $x, $y;
})();

或者

示例 3:

$x = 786; $y = 333;
(function() use($x, $y){
  echo $x, $y;
})();

我在 stackoverflow 上找不到任何表明 example1 是正确语法的 php 文档或代码。如果php中允许使用类似example1的语法,请通过官方参考告诉我。

【问题讨论】:

    标签: php syntax anonymous-function


    【解决方案1】:

    第一个示例是有效地定义函数,然后使用值调用它。有点像...

    (函数定义)(要传递的值);

    你可以分成两部分来展示它是如何工作的......

    $fn =function($x, $y, $conn) {
      echo $x, $y; //$x and $y are not visible outside
    }; 
    ($fn)(786, 333, $mysqli);
    

    【讨论】:

    • 这也是我的直觉。就像foo(786,333,$mysql) 一样,其中foo 被其实际定义所取代。我从我的 JavaScript 背景中得到了这个。似乎对于 php.net 来说太微不足道了。编辑:阿洛斯,($fn)(786, 333, $mysqli);$fn(786, 333, $mysqli); 一样吗?
    • @user31782,有时需要括号来确保您正确使用该功能。在我的代码中,你不需要它(因为使用了变量),如果你有完整的函数 - 括号确保完整的函数被用作要调用的函数。
    【解决方案2】:
    //$mysqli = new mysqli(...)
    (function($x, $y, $conn) {
      echo $x, $y; //$x and $y are not visible outside
    })(786, 333, $mysqli);
    

    这是完全正确的,仅从两点得出:

    • function(...) { ... } 语法创建并返回一个Closure 对象
    • Closure 对象可以像函数名一样直接调用

    没有特殊的语法,它只是将 PHP 的构建块组合在一起的无数种方法之一。

    出于同样的原因,您还可以进行许多其他组合,例如:

    class Foo
        public static function make_function() {
            return function($x, $y, $conn) {
                echo $x, $y;
            };
        }
    }
    (Foo::make_function())(786, 333, $mysqli);
    

    还有:

    class Foo
        public static function make_function($conn) {
            return function($x, $y) use ($conn) {
                echo $x, $y;
            };
        }
    }
    (Foo::make_function($conn))(786, 333, $mysqli);
    

    与您的示例一样,指定use 子句在这种特定情况下并没有太大区别,因为我们会立即执行该函数。但它允许您在一个地方“捕获”一个值,然后稍后传递其他参数,例如

    class Foo
        public static function make_function($conn) {
            return function($x, $y) use ($conn) {
                echo $x, $y;
            };
        }
    }
    $f = Foo::make_function($mysqli);
    // later...
    $f(786, 333);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      相关资源
      最近更新 更多