【问题标题】:What is the php settings that controls how a variable is bound in a closure?控制变量如何在闭包中绑定的 php 设置是什么?
【发布时间】:2017-01-24 22:22:12
【问题描述】:

以下两部分在两台不同的机器上工作。
两台机器都是php5.5.x(不知道x是什么)。
即一个只在一台机器上工作,另一个在两台机器上工作(带有use的那个)。
注意在第二个版本中使用了关键字**use**。 遗憾的是,我无法通过命令行访问这些机器来检查 php 设置。
第一版

$a = 1;
$b = function(){
   echo $a;
};
$b();

第二版:

$a = 1;
$b = function() use($a){
   echo $a;
};
$b();

【问题讨论】:

  • Umm.. 有了那个代表,我希望看到哪些可以在 2 台机器上工作,哪些不能,工作不工作实际上是指 PHP 版本?
  • 第一个版本不可能工作,它只能产生注意:未定义变量:a..
  • 为什么需要命令行访问权限来检查 PHP 设置?使用phpinfo() 函数。
  • 如果你能证明第 1 版确实按所写的那样工作,我会吃掉我的帽子。

标签: php functional-programming closures bind php-5.5


【解决方案1】:

您的第一个闭包遇到了变量范围问题,$a 在闭包中不存在。您可以通过以下方式解决此问题:

  1. 在闭包内部定义global $a
  2. 在第二个示例中使用use 关键字。
    • 仅适用于 PHP 版本>= 5.3
  3. 改用参数
    • echo (function($a){ echo $a; })("test");

你应该启用错误报告,看看为什么你的第一个闭包一开始就不起作用

ini_set("display_errors", 1);
error_reporting(-1);

$a = 1;
$b = function(){
  echo $a; // Notice: Undefined variable: a in /path/to/script.php on line #
};
$b();

如果两台主机都运行 PHP 5.5,则输出应该相同。可能是 1 正在抑制通知消息,而另一个不是。如果是这种情况,您应该寻找的 ini 设置是:

error_reporting
display_errors

如上所示,您可以在脚本运行时使用ini_set() 更改这些设置,其中error_reporting(-1)ini_set('error_reporting', E_ALL | E_STRICT) 的简单快捷方式

【讨论】:

  • 我试图弄清楚涉及到什么 php 设置,如果有的话。正如我在示例中所写,带有use 的那个在两台机器上都工作。
  • @ItayMoav-Malimovka 有 no 配置设置,只有主要的 PHP 版本会有所不同。您遇到了变量范围问题。 $a 在第一个示例中的函数的本地范围内不存在。
  • 对不起,如果我不清楚。两个版本都有效。只是在不同的机器上。两台机器都是php 5.5.x(我认为一台是0.9,一台是0.21,但不能确定)
猜你喜欢
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
相关资源
最近更新 更多