доступ к переменным во вложенных функциях в php

#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;