Как вы получаете все объявленные переменные из предыдущей области? - PullRequest
3 голосов
/ 16 февраля 2012
// SCOPE 1
printsmth();    

function printsmth(){
  // SCOPE 2 (printsmth)

  // here (inside SCOPE 2) get variables visible in SCOPE 1
  // var_dump($vars);
}

Могу ли я сделать это?

По сути, я хочу получить все объявленные переменные из того места, где была вызвана моя функция, но внутри функции (и игнорировать переменные, объявленные в моей функции)


что-то вроде получения результата get_defined_vars(); в моей функции, но для предыдущей области видимости:)


хорошо, еще яснее - я просто хочу свой собственный клон `get_defined_vars`функция.Когда я вызываю свою функцию, она должна отображать список объявленных переменных в текущей области видимости.

Ответы [ 5 ]

2 голосов
/ 16 февраля 2012

Вы можете просто объявить переменные как глобальные в области 1 и присвоить значение переменным.Далее объявите ту же переменную, что и глобальная, в теле функции (область 2) для доступа к ней.Приведенный выше пример становится

// SCOPE 1
global $var1, $var2;
$var1 = 1;
$var2 = 2;

printsmth();    

function printsmth(){
   global $var1, $var2;
   echo 'Var1:' . $var1 . 'Var2:' . $var2;//now accessible in scope 2
}

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

// SCOPE 1
$var1 = 1;
$var2 = 2;

printsmth($var1, $var2);

// Note the "&" appended to the parameters. This passes the variables to the 
// function by reference. Any modifications made to the variables will update
// the actual variables in the scope 1

function printsmth(&$var1, &$var2){
   global $var1, $var2;
   echo 'Var1:' . $var1 . 'Var2:' . $var2;//now accessible in scope 2
}
1 голос
/ 11 октября 2012

Я знаю, что вы спрашиваете. Это невозможно так, как вы (или я) хотели бы.

Вы должны передать их способами, подобными упомянутым выше. Вот как я это делаю:

function print_smith($globals) {
    extract($globals);
    echo $variable;
}

$variable = 'Smith';
$vars = get_defined_vars();
printsmith($vars); // Smith

Этот способ немного круче (без передаваемых параметров):

function print_smith() {
    global $vars;
    if(NULL !== $vars) {
        extract($vars);
    }
    echo $variable;
}

$variable = 'Smith';
$vars = get_defined_vars();
printsmith(); // Smith
1 голос
/ 16 февраля 2012

Это так просто

$valriable_Outside_scope;
// SCOPE 1
printsmth();    

function printsmth(){
  global $valriable_Outside_scope;
  // SCOPE 2 (printsmth)

  // here (inside SCOPE 2) get variables visible in SCOPE 1
}

global varibale_name;// позволит вам получить доступ к элементам вне области действия

0 голосов
/ 16 февраля 2012

это:

       $var = "hello";
       printsmth();

       function printsmth(){
         global $var;
         echo $var;
       }
0 голосов
/ 16 февраля 2012

Используйте global ключевое слово:

$variable = true;

function printsmth(){
  global $variable;

  if ( $variable ) {
    echo 'it works';
  }
}

printsmth();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...