Отменить все определенные переменные из текущей функции - PullRequest
3 голосов
/ 20 октября 2011

Например, у меня есть эта функция:

function foo($whaaaat){

  $var1 = 'a';  
  $a = 1;
  $b = 2;

  ...


  // here unset all variables defined above (including arguments) 
  require 'somefile.php';
}

Итак, могу ли я сбросить все эти переменные до требуемой точки?

Очевидно, без вызова unset вручную для каждой переменной, потому что я сам разобрался:)

Есть ли какая-нибудь функция, которая делает это?

Ответы [ 8 ]

8 голосов
/ 20 октября 2011

Вы можете обернуть require в анонимную функцию :

function foo($a){
  $b = 2;

  call_user_func(function() {
   require 'somefile.php';
  });
}
7 голосов
/ 20 октября 2011

Предполагая, что ни одна из этих функциональных переменных не объявлена ​​как глобальная, вы можете попробовать что-то вроде

array_diff(get_defined_vars(), $GLOBALS)

, чтобы получить список локальных переменных, а затем перебрать результаты, чтобы сбросить их.

4 голосов
/ 20 октября 2011

Вы можете сделать это так:

function require_noscope($filename)
{
    // Required file cannot see variables from other function
    require $filename;
}

function foo($whaaaat){

  $var1 = 'a';  
  $a = 1;
  $b = 2;
  require_noscope('somefile.php');
}
2 голосов
/ 20 октября 2011

Вот решение:

echo('Before: ' . $test1 . '<br>');

$vars = array_keys(get_defined_vars());
foreach($vars as $var) {
    if($var == 'GLOBALS' || $var == '_POST' || $var == '_GET' || $var == '_COOKIE' || $var == '_FILES' || $var == '_REQUEST' || $var == '_SERVER' || $var == '_ENV')
        continue;
    unset($$var);
}
echo('After: ' . $test1 . '<br>');

Мой тест выводит это:

До: здесь?

После того, как:

2 голосов
/ 20 октября 2011

Это может работать (не проверено):

$allVars = get_defined_vars(); // Returns array of all defined variables
foreach ($allVars as $allVars) { unset($allVars); }

Редактировать: Как я уже говорил, никогда не проверял и никогда не использовал это, но это могло привести Алекса в правильном направлении.

1 голос
/ 31 мая 2013

Я согласен с Уитстоном. get_defined_vars() просто идеально подходит для "многократных" трюков. Этот метод ниже, сбрасывает ВСЕ переменные. Все, кроме найденных в безымянном массиве внутри цикла foreach.

foreach(get_defined_vars() as $k=>$y){ 
 if( !in_array( $k, 
 array(
  'myRequredVariableName1',
  'myRequredVariableName2',
  '_ENV',
  '_SESSION',
   '_COOKIE',
  'HTTP_SESSION_VARS',
  'HTTP_COOKIE_VARS'
  )))
  { $$k=null; unset($$k);} 
    unset($y, $k);
} 

// Check for leftovers
header('Content-type:text/plain; charset=utf-8'); 
var_export(get_defined_vars()); 
exit;

Значения на самом деле являются именами переменных без '$', где переменная переменная unset($$k); соответствует РЕАЛЬНОМУ и определенному и уничтожает его, если он присутствует. Таким образом, таким образом, вы можете иметь полный контроль над тем, что осталось для системы.

Обратите внимание , что некоторые настройки общего хостинга полагаются только на суперглобальные переменные _SERVER, поэтому _ENV, HTTP_SESSION_VARS, HTTP_COOKIE_VARS вообще не требуются. Скорее всего, вы всегда захотите сохранить _COOKIE и _SESSION, но не _GET и _POST, а также _FILES. Решение меняется. Протестируйте и убедитесь сами, что должно стоять в массиве, прежде чем применять эту хитрость в своей производственной среде.

1 голос
/ 20 октября 2011

Ничего не встроено, но вы можете использовать функцию get_defined_vars () , чтобы получить массив всех определенных переменных, а затем использовать цикл foreach для их сброса.Таким образом, вы сделаете все это в 4 строки, и это будет гибко.

$list_of_vars =  array_diff(get_defined_vars(), $GLOBALS); // Was just get_defined_vars() before Marc B corrected me in his post.
foreach($list_of_vars as $var){
    unset($var);
}

Редактировать: Как отметил Марк Б., это также сбросит ваши переменные $ GLOBAL.Я отредактировал мой пример, чтобы показать, как правильно получить список переменных.

0 голосов
/ 10 августа 2017

Нужно было это, и существующие ответы здесь не были действительно полезны. Следующее краткое, к делу и работает:

foreach(get_defined_vars() as $k => $v)
    unset($$k);
unset($k, $v);

Если после этого вызвать var_dump(get_defined_vars()), вы получите пустой массив.


Примечание: Если только в глобальном контексте (вопрос не в этом, он в функции), get_defined_vars не будет возвращать глобальные переменные, поэтому не нужно ничего фильтровать или проверять , просто отмени все это.

...