在PHP脚本中取消所有变量的设置

16
尝试在脚本中自动取消所有变量的设置。
尝试过以下方法:
  echo '<br /> Variables in Script before unset(): <br />';
  print_r(array_keys(get_defined_vars()));
  echo '<br /><br />';
  var_dump(get_defined_vars());

  // Creates string of comma-separated variables(*) for unset.
  $all_vars = implode(', $', array_keys(get_defined_vars()));

  echo '<br /><br />';
  echo '<br />List Variables in Script: <br />';
  echo $all_vars;
  unset($all_vars);

  echo '<br /><br />';
  echo '<br />Variables in Script after unset(): <br />';
  print_r(array_keys(get_defined_vars()));
  echo '<br />';
  var_dump(get_defined_vars());

为什么它不起作用?

有没有更好的方法来做这件事?

感谢您的帮助!

(*) 看起来它并没有真正创建变量,而是创建了一些看起来像变量的字符串...


3
为什么你需要这样做? - user1864610
1
我认为你误解了implode函数的用法。 - Semi-Friends
没有太多必要取消所有变量。在PHP中,内存管理类似于C或C++,需要释放已分配的内存。 PHP将在脚本执行后自动释放所有使用过的内存。 - David Corbin
1
仅供大家了解:我这么做的原因是因为我们的系统编码相当糟糕,我们必须在“报告邮寄”例程中包含()文件,以便假装我们已经运行了一个报告,并给出他们所期望的$_POST。由于它是一个include,变量被塞入全局范围内,我们应该在加载另一个(不相关的)报告之前清理它们。我对其他人使用此代码的用例感兴趣。 - Vael Victus
4个回答

18

就给你->

$vars = array_keys(get_defined_vars());
for ($i = 0; $i < sizeOf($vars); $i++) {
    unset($$vars[$i]);
}
unset($vars,$i);

为了澄清,implode返回“与数组元素顺序相同的所有数组元素的字符串表示形式”。 http://php.net/manual/zh/function.implode.php

Unset需要实际的变量作为参数,而不仅仅是字符串表示形式。这类似于get_defined_vars()返回的内容(而不是实际的变量引用)。因此,代码遍历字符串数组,并使用额外的$返回每个字符串引用 - 可以使用unset。


这对我没用。我认为$vars没有通过引用分配。你只是在取消 vars 变量中的副本,同时保留原始内容不变吗? - ThatOneDude
好的,已经更正了。抱歉,我以为它能工作(某些东西确实在工作,只是不确定是什么) :) - airtech
Ash501,提醒一下 - 那段代码片段不起作用。 - airtech
@airtech - 是的,你说得对,你的现在可以用了 - 谢谢!我试图避免循环。让我想知道为什么我的不起作用...? - Ash501
1
感谢您的解释! - Ash501
显示剩余2条评论

7

不知道你们,但对于我来说,$$vars 不起作用。

这是我的做法。

$vars = array_keys(get_defined_vars());
foreach($vars as $var) {
    unset(${"$var"});
}

3

foreach (array_keys($GLOBALS) as $k) unset($$k); unset($k);

这段代码会遍历全局变量数组的所有键名,并依次删除其对应的变量。最后,它还会将变量$k也删除。

2
注意:此代码必须在全局作用域中运行 - 在函数中使用会引发错误!最好使用unset($GLOBALS[$k])而不是unset($k) - user5147563

-1

我无法在我的PHP 7.0实例上运行@airtech的答案。它会抛出一个数组转换为字符串的错误。

他的解决方案的这个更新/简化版本适用于我(我还添加了花括号“{}”以获得更清晰的表述):

foreach(array_keys(get_defined_vars()) as $strVarName){
  unset(${$strVarName});
}

回答原问题,正如其他人所说,implode只会创建一个看起来像变量的字符串,但PHP不会将其解释为变量。
解决问题的代码利用了PHP中的“可变变量”概念。有关此概念的更多信息,请参见此处: https://www.php.net/manual/en/language.variables.variable.php

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接