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

Posted

技术标签:

【中文标题】取消设置 PHP 脚本中的所有变量【英文标题】:Unset all variables in PHP script 【发布时间】:2014-12-02 14:04:35 【问题描述】:

尝试自动取消设置脚本中的所有变量。

试过这种方法:

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

为什么它不起作用?

有没有更好的方法来做到这一点?

感谢您的帮助!

(*) It's seems somewhat that it does not really create the variables, but a string that looks like variables...

【问题讨论】:

你为什么需要这样做? 我认为你误解了内爆函数的使用.. 没有太多理由取消设置所有变量。 php 中的内存管理就像需要释放分配的内存的 C 或 C++。 PHP 将在脚本执行后自动释放所有使用的内存。 仅供大家了解:我这样做的原因是因为我们的系统编码相当糟糕,我们必须在一个“报告邮件”例程中包含()文件,我们假装我们已经通过给他们期望的 $_POST 来运行报告。由于它是一个包含,变量被填充到全局范围内,我们应该在加载另一个(不相关的)报告之前清理它们。我对此代码的其他用例感兴趣。 【参考方案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

【讨论】:

【参考方案2】:

不了解你们,但 $$vars 对我不起作用。

我就是这样做的。

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

【讨论】:

【参考方案3】:

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

【讨论】:

请注意: 这必须在全局范围内运行 - 在函数中使用 this 会引发错误!最好使用unset($GLOBALS[$k]) 而不是unset($k)【参考方案4】:

给你->

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

unset($vars,$i);

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

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

【讨论】:

这对我不起作用。我不认为 $vars 是通过引用分配的。您不是只是在 vars 变量中取消设置副本,同时保持原始不变吗? 好了 - 已更正。抱歉,我以为我可以正常工作(有些工作正常 - 只是不确定是什么):) Ash501,仅供参考 - 代码 sn-p 不起作用。 @airtech - 是的,你是对的,你的现在可以工作了 - 谢谢!试图避免循环。让我想知道为什么我的不起作用...? 感谢您的解释!

以上是关于取消设置 PHP 脚本中的所有变量的主要内容,如果未能解决你的问题,请参考以下文章

“header()” php 函数是不是取消设置全局变量?

PHP函数中使用的变量会在函数执行后自动取消设置吗?

PHP Drupal - 取消设置(不包括)所有核心样式表 - 主题变量覆盖。

为啥不会/如何对 PHP 会话变量进行排序而不是取消设置

你需要取消设置PHP内存问题吗?

PHP 类取消设置/清除私有数组变量