#php
#php
Вопрос:
предположим, у меня есть две вложенные функции, подобные этой :
$a = 1;
$b = 2;
function test(){
$b = 20;
function Sum()
{
$b = $GLOBALS['a'] $b;
}
}
test();
Sum();
echo $b;
теперь я хочу в функции Sum() получить доступ к переменной $ b, объявленной в функции test();
Как вы делаете?
Комментарии:
1. Неправильно вкладывать подобные функции в PHP. То, что вы хотите сделать, стало возможным в PHP 5.3, но я не уверен, что это действительно то, что вам нужно
2. этот пример не выполняет определенную задачу. это всего лишь пример того, как получить $b, объявленный в функции test(), в функции sum().
3. Тогда, пожалуйста, предоставьте пример / описание, которое показывает больше фактического варианта использования. Вложенные определения функций, подобные текущему примеру, ничего не делают с видимостью переменной,
function Sum
объявляются и определяются в глобальной области видимости точно так же,function test
как есть, определение только «откладывается» доfunction test
выполнения. С php 5.3 (как упоминал Пекка) были введены лямбда-функции / замыкания. Являются ли они тем, что вы ищете, зависит от того, чего вы на самом деле пытаетесь достичь.4. Используйте
return
-операторы вместо глобальных.$b = sum($a, 20);
может работать просто отлично.
Ответ №1:
Режим случайного угадывания:
ваша функция Sum()
«обычно» принимала бы два параметра / операнда, такие как
function Sum($a, $b) {
return $a $b;
}
echo Sum(1, 20);
Теперь у вас есть функция Test(), и вы хотите, чтобы она возвращала функцию fn, которая принимает только один параметр, а затем вызывает Sum($ a, $ b) с одним «предопределенным» параметром и тем, который передается в fn.
Это называется либо обработкой, либо частичным применением (в зависимости от того, что именно вы реализуете), и вы можете сделать что-то подобное с лямбда-функциями / замыканиями начиная с php 5.3
<?php
function Sum($a, $b) {
return $a $b;
}
function foo($a) {
return function($b) use ($a) {
return Sum($a, $b);
};
}
$fn = foo(1) // -> Sum(1, $b);
$fn = foo(2) // -> Sum(2, $b);
echo $fn(47);
Ответ №2:
Почему бы не использовать это?
$a = 1;
$b = 2;
function test(){
$b = Sum(20);
}
function Sum($value)
{
$value = $GLOBALS['a'] $value;
return $value;
}
test();
// Sum(); // Why do you need this here??
echo $b;
Редактировать: лучше без глобальных
$a = 1;
$b = 2;
function Sum($value1, $value2)
{
return $value1 $value2;
}
$b = 20; // you could call Sum($a, 20); instead
$b = Sum($a, $b);
echo $b;
Ответ №3:
В соответствии с контекстом лучший способ — передать переменную функции следующим образом
Sum($b)
Но если вы ищете альтернативу, вы можете использовать замыкания, но ПОМНИТЕ, ЧТО PHP<5.3 не поддерживает замыкания
Вы можете сделать
$a = 1;
$b = 2;
function test() {
$b = 20;
function Sum() use($b)
{
$b = $GLOBALS['a'] $b;
}
}
test();
Sum();
echo $b;