Доступ к переменной, определенной в родительской функции

Есть ли способ получить доступ к $foo изнутри inner() ?

 function outer() { $foo = "..."; function inner() { // print $foo } inner(); } outer(); 

PHP <5.3 не поддерживает закрытие, поэтому вам нужно либо передать $ foo в inner (), либо сделать глобальный глобальный foo как внутри external (), так и inner () (BAD).

В PHP 5.3 вы можете сделать

 function outer() { $foo = "..."; $inner = function() use ($foo) { print $foo; }; $inner(); } outer(); outer(); 

Или я пропускаю что-то более сложное, что вы пытаетесь сделать?

 function outer() { $foo = "..."; function inner($foo) { // print $foo } inner($foo); } outer(); 

ОК. Думаю, я вижу, что вы пытаетесь сделать. Вы можете сделать это с помощью классов с использованием глобальных, но не уверены в этом конкретном случае

Я хотел бы упомянуть, что это, возможно, не лучший способ кодирования, поскольку вы определяете функцию внутри другого. Всегда есть лучший вариант, чем делать таким образом.

 function outer() { global $foo; $foo = "Let us see and understand..."; // (Thanks @Emanuil) function inner() { global $foo; print $foo; } inner(); } outer(); 

Это будет выводить: –

 Let us see and understand... 

Вместо написания этого способа вы могли бы написать следующий фрагмент кода:

 function outer() { $foo = "Let us see improved way..."; inner($foo); print "\n"; print $foo; } function inner($arg_foo) { $arg_foo .= " and proper way..."; print $arg_foo; } outer(); 

Этот последний фрагмент кода выводит: –

 Let us see improved way... and proper way... Let us see improved way... 

Но, наконец, вы всегда будете решать, какой процесс вы собираетесь использовать. Поэтому надеюсь, что это поможет.

Я знаю, что это можно сделать с помощью классов, однако с автономными функциями я был уверен, что вы не сможете выполнить поиск без установки публичной / частной переменной.

Но единственный возможный способ, которым я могу думать (не испытывая такого рода вещи), – передать foo поверх внутреннего, делая эхо или печать. 🙂

Я не думаю, что это возможно.

В PHP Manual есть некоторые комментарии по этому поводу, и ни один из них не может найти решение.

http://www.php.net/manual/en/language.variables.scope.php#77693

Другой комментарий предполагает, что вложенные функции фактически не «вложены» для реального

http://www.php.net/manual/en/language.variables.scope.php#20407