开发者

Do PHP closures not have access to parnt function parameters?

开发者 https://www.devze.com 2023-01-07 02:49 出处:网络
I\'ve been writing some code for PHP 5.3, and I wanted to do something similar to the code I\'m showing below. I expect this code to print \'hellohello\', but it prints \'hello\' instead, and an error

I've been writing some code for PHP 5.3, and I wanted to do something similar to the code I'm showing below. I expect this code to print 'hellohello', but it prints 'hello' instead, and an error.

It appears the $inner closure does not have access to the outer function's parameters. Is this normal behavior? Is it a PHP bug? I can't see how that could be considered correct behavior...

<?php

function outer($var) {

  print $var;

  $inner = function() {
    print $var;开发者_StackOverflow中文版
  };
  $inner();
}

outer('hello');

Thanks!


You need to use the use keyword. See this for more details.

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"

Here, getAdder() function creates a closure using parameter $x (keyword "use" forces getting variable from context), which takes additional argument $y and returns it to the caller.

So, to make your example work the way you want it to:

<?php

function outer($var) {

  print $var;

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

outer('hello');


I would guess that the $inner function doesn't have the scope to access $var

Try this

function outer($var) {

  print $var;

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

outer('hello');
0

精彩评论

暂无评论...
验证码 换一张
取 消