从当前函数取消设置所有已定义的变量

时间:2011-10-20 18:52:50

标签: php function variables unset

例如,我有这个功能:

function foo($whaaaat){

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

  ...


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

那么,我可以在需求点之前取消设置所有这些变量吗?

显然没有在每个变量上手动调用unset,因为我自己想出了:)

是否有一些功能可以做到这一点?

8 个答案:

答案 0 :(得分:8)

您可以将require打包在anonymous function

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

  call_user_func(function() {
   require 'somefile.php';
  });
}

答案 1 :(得分:7)

假设这些函数内变量都没有被声明为全局变量,你可以试试像

这样的东西
array_diff(get_defined_vars(), $GLOBALS)

获取局部变量的列表,然后遍历结果以取消设置它们。

答案 2 :(得分:4)

你可以这样做:

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');
}

答案 3 :(得分:2)

这可能有用(未经测试):

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

编辑:正如我所说,从未测试过,也从未使用过它,但它可以引导Alex走向正确的方向。

答案 4 :(得分:2)

这是一个解决方案:

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>');

我的测试输出:

  

之前:在这里?

     

后:

答案 5 :(得分:1)

没有内置任何内容,但您可以使用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);
}

编辑:正如Marc B指出的那样,这也将取消你的$ GLOBAL变量。我编辑了我的示例,以展示如何正确获取变量列表。

答案 6 :(得分:1)

我同意Whetstone。 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);与REAL和已定义的变量匹配,如果存在,则销毁它。因此,通过这种方式,您可以完全控制系统剩余的内容。

注意 某些共享主机设置仅依赖于_SERVER超全局,因此根本不需要_ENV,HTTP_SESSION_VARS,HTTP_COOKIE_VARS。最有可能你总是希望保留_COOKIE和_SESSION,但不要_GET和_POST或_FILES。决定各不相同。在将此技巧放在您的生产环境之前,测试并查看您自己应该在数组中的内容。

答案 7 :(得分:0)

需要这个,这里现有的答案并没有多大帮助。以下是简短的,并且有效:

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

如果在此之后调用var_dump(get_defined_vars()),您将获得一个空数组。

注意: 除非在全局范围内(问题不是,它在函数中),get_defined_vars不会返回任何全局,所以不需要过滤或检查任何东西,只需取消设置。