Разве PHP-замыкания не имеют доступа к параметрам функции parnt? - PullRequest
1 голос
/ 10 июля 2010

Я писал код для PHP 5.3 и хотел сделать что-то похожее на код, который я показываю ниже.Я ожидаю, что этот код напечатает 'hellohello', но вместо этого он напечатает 'hello' и ошибку.

Похоже, что $ inner closure не имеет доступа к параметрам внешней функции.Это нормальное поведение?Это ошибка PHP?Я не понимаю, как это можно считать правильным поведением ...

<?php

function outer($var) {

  print $var;

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

outer('hello');

Спасибо!

Ответы [ 2 ]

5 голосов
/ 10 июля 2010

Вам необходимо использовать ключевое слово use. См. это для более подробной информации.

В Википедии есть объяснение этому :

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');
0 голосов
/ 10 июля 2010

Я бы предположил, что функция $ inner не имеет области доступа к $ var

Попробуйте это

function outer($var) {

  print $var;

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

outer('hello');
...