3

例如,我有这个功能:

function foo($whaaaat){

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

  ...


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

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

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

有什么功能可以做到这一点吗?

4

8 回答 8

8

您可以将其包装require匿名函数中:

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

  call_user_func(function() {
   require 'somefile.php';
  });
}
于 2011-10-20T18:56:46.647 回答
7

假设这些函数内变量都没有声明为全局变量,您可以尝试类似

array_diff(get_defined_vars(), $GLOBALS)

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

于 2011-10-20T18:58:44.060 回答
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');
}
于 2011-10-20T18:55:53.303 回答
2

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

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

编辑:正如我所说,从未测试过也从未使用过它,但它可以引导亚历克斯朝着正确的方向前进。

于 2011-10-20T18:57:39.423 回答
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>');

我的测试输出如下:

之前:这里?

后:

于 2011-10-20T19:02:39.693 回答
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 变量。我已经编辑了我的示例以展示如何正确获取变量列表。

于 2011-10-20T18:57:08.323 回答
1

我同意惠斯通的观点。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。决定因人而异。在将这个技巧应用到您的生产环境之前,请自行测试并查看数组中应该包含哪些内容。

于 2013-05-31T13:22:58.217 回答
0

需要这个,这里的现有答案并没有真正的帮助。以下内容简明扼要且有效:

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

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


注意:除非在全局范围内(问题不是,它在函数中),get_defined_vars否则不会返回任何全局变量,因此无需过滤或检查任何内容,只需取消设置即可。

于 2017-08-10T19:33:11.360 回答