取消设置从类内方法提取php中的变量

取消设置从类内方法提取php中的变量,php,unset,Php,Unset,将打印 0个蛋1个蛋2个蛋3个蛋4个蛋5个蛋6个蛋 然后,您可以从globals中添加$egg的删除,因为这是它所在的位置: $array = range(0,6); $i = 0; foreach( $array as $a ) { echo $i.' '; if( $i == 0 ) { $egg = true; } ++$i; if( isset($egg) ) { echo 'eggs '; } } 现在它将打印: 0个鸡蛋1234

将打印

0个蛋1个蛋2个蛋3个蛋4个蛋5个蛋6个蛋

然后,您可以从globals中添加$egg的删除,因为这是它所在的位置:

$array = range(0,6);
$i = 0;
foreach( $array as $a )
{
   echo $i.' ';
   if( $i == 0 )
  {
    $egg = true;
  }
  ++$i;
  if( isset($egg) )
  {
     echo 'eggs ';
  }
}
现在它将打印:

0个鸡蛋123456


但是,当您在类方法中时,您会取消设置什么,变量实际存储在哪里?

首先不要使用
extract()
函数,只需在给定数组上迭代即可

$array = range(0,6);

$i = 0;

foreach( $array as $a )
{
   echo $i.' ';
   if( $i == 0 )
  {
    $egg = true;
  }
  else
  {
     unset( $GLOBALS['egg'] );
  }
  ++$i;
  if( isset($egg) )
  {
     echo 'eggs ';
  }
}

现在已经很晚了,但仅供参考

您可以使用以下方法直接取消设置()

foreach ($data as $delta => $element) {
  if (is_array($element)) {
    foreach ($element as $deltaInner => $elementInner) {
      // ...
提取物的作用相当于:

unset($$var);
因此,要取消设置,请执行以下操作:

foreach($arr as $key => $value) {
    $$key = $value;
}
但正如前面提到的,您不需要取消设置()它们,因为它们在函数完成时会被删除,因为它们将超出范围

此外,extract()完全可以,因为它(很可能)不复制数据值,它只是为每个数组键创建新符号。PHP内部只会在您实际修改时复制值,即使用引用计数进行写时复制


在对大型数组执行extract()之前和之后,可以使用memory\u get\u usage()对其进行非常规测试

当函数执行终止函数执行时,提取的变量应自动超出范围,这是否包括foreach函数?不,它是在
runner
函数终止时:标准PHP变量范围规则向上,因此foreach循环的第二次迭代。。因此,在第一次迭代中设置且在第二次迭代中未重置的任何var都将保持不变。这就是我正在努力清理的。。或者我弄错了?为什么首先要执行
提取
:它会导致重大问题,因为您不知道变量的名称:为什么您不能首先简单地使用
$data
数组。当上面代码中的$元素是assoc数组时,这实际上不起作用。如果您有嵌套数组,则嵌套循环,我将用嵌套数组扩展答案。看来值得一试。对我来说,理想的解决方案是能够提取$delta,然后在迭代结束时取消设置从$delta提取的所有变量。我知道如何使用foreach循环。。无论如何,我不会在最终代码中使用foreach循环。与std for相比,开销要多得多。我只是在寻找一个与extract完全相反的答案:您只需添加一个几乎没有必要的附加函数调用。直接启动循环是您最快的选择。
unset($$var);
foreach($arr as $key => $value) {
    $$key = $value;
}
foreach(array_keys($arr) as $key) {
    unset($$key);
}