Разве PHP-замыкания не имеют доступа к параметрам функции parnt?

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

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

<?php

function outer($var) {

  print $var;

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

outer('hello');

Спасибо!

2 ответа

Решение

Вам нужно использовать 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');

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

Попробуй это

function outer($var) {

  print $var;

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

outer('hello');
Другие вопросы по тегам