【问题标题】:Do PHP closures not have access to parnt function parameters?PHP 闭包不能访问父函数参数吗?
【发布时间】:2011-03-14 03:32:21
【问题描述】:

我一直在为 PHP 5.3 编写一些代码,我想做一些类似于下面显示的代码的事情。我希望这段代码打印“hellohello”,但它会打印“hello”,并出现错误。

$inner 闭包似乎无法访问外部函数的参数。这是正常行为吗?它是一个PHP错误吗?我看不出这怎么能被认为是正确的行为......

<?php

function outer($var) {

  print $var;

  $inner = function() {
    print $var;
  };
  $inner();
}

outer('hello');

谢谢!

【问题讨论】:

  • 这不是错误,而是一个特性:P 一个设计糟糕的特性......
  • 另外,不仅仅是参数 - 它也是 outer() 的任何本地变量。
  • 哇。这很可悲。不过,谢谢您的回答!

标签: closures php-5.3 php-closures


【解决方案1】:

您需要使用use 关键字。详情请见this

Wikipedia has some explanation of this:

function getAdder($x)
{
    return function ($y) use ($x) {
        return $x + $y;
     };
}

$adder = getAdder(8);
echo $adder(2); // prints "10"

这里,getAdder() 函数使用参数 $x(关键字“use”强制从上下文中获取变量)创建一个闭包,它接受附加参数 $y 并将其返回给调用者。

所以,为了让您的示例按您希望的方式工作:

<?php

function outer($var) {

  print $var;

  $inner = function() use ($var) {
    print $var;
  };
  $inner();
}

outer('hello');

【讨论】:

  • 谢谢您,先生。太恶心了!
【解决方案2】:

我猜$inner 函数没有访问$var 的范围

试试这个

function outer($var) {

  print $var;

  $inner = function($var) {
    print $var;
  };
  $inner($var);
}

outer('hello');

【讨论】:

    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2012-05-22
    相关资源
    最近更新 更多