【问题标题】:how do "really" clear a global PHP array如何“真正”清除全局 PHP 数组
【发布时间】:2013-08-13 09:04:13
【问题描述】:

注意:似乎我对发生的事情有误,使用$a = array(); 没有问题。这是因为对数组的所有分配都是通过复制进行的。 (我原以为有一些引用访问会导致问题 - 但这只是一个错字。我在下面的答案中添加了一些细节。

我有一些看起来像这样的 PHP:

$myArray = array();

function useArray() {
  global $myArray;
  // ... do something with myArray ...
}

function clearArray() {
  global $myArray;
  // ... Somehow clear the global array ...
}

我知道从设计的角度来看这很糟糕,但是需要解决一些我无法更改的第三方代码...

我的问题是我可以在clearArray 函数中添加什么来使其工作? 使用$myArray=array();unset($myArray); 的通常建议不起作用,因为它们只更改本地版本,而不是全局版本。 我想我可以遍历数组中的键并取消设置每个反过来 - 像这样:

function clearArray() {
  global $myArray;
  foreach($key in array_keys($myArray) ) {
     unset( $myArray[$key] );
  }
}

但这似乎很老套且不清楚。有没有更好的解决方案?

【问题讨论】:

  • 那个“hacky”版本有用吗?
  • $myArray = [] 有效——你得到不同的结果吗?
  • 我的测试表明$myArray = array(); 工作正常 - 你有什么问题?
  • 查看:[php stackoverflow.com/questions/4826066/…
  • @SmokeyPHP - 你是绝对正确的。我对数组分配与对象分配的一些混淆,加上我的部分代码中缺少“全局”,导致我得出错误的结论。

标签: php


【解决方案1】:

不要忘记访问全局变量有两种方法:

function clearArray() {
    unset($GLOBALS['myArray']);
}

【讨论】:

    【解决方案2】:

    使用$myArray=array(); unset($myArray);的通常建议显然有效

    【讨论】:

    • unset ($myArray) 可能很明显,但它肯定不起作用。
    【解决方案3】:

    可以通过引用传递:

    $a = array ('one', 'two', 'three');
    
    print_r ($a);
    fone ($a);
    print_r ($a);
    ftwo ($a);
    print_r ($a);
    
    function fone ($a) 
    {
       $a = array ();
    }
    
    function ftwo (&$a)
    {
       $a = array ();
    }
    

    结果:

    Array
    (
        [0] => one
        [1] => two
        [2] => three
    )
    Array
    (
        [0] => one
        [1] => two
        [2] => three
    )
    Array
    (
    )
    

    【讨论】:

      【解决方案4】:

      PHP 的数组赋值是通过复制(而对象赋值是通过引用)。这意味着很多你认为存在的漏洞,其实根本就不存在。

      这是一个简单的例子:

      $a = array("A");
      $b = &$a;
      $c = $a;
      
      
      function clear1() {
        global $a;
        $a = array();
      }
      
      clear1();
      print(json_encode(array($a,$b,$c))."\n"); 
      

      这会输出[[],[],["A"]]。使用您帖子中的 clear 获得相同的结果。

      function clear2(){
        global $a;
        foreach(array_keys($a) as $key) {
          unset( $a[$key] );
        }
      }
      

      $c 未被清除而$b 被清除的原因是$c$a 的深层副本(数组分配的默认值),而$c 是对$a 的引用。关键是数组是值,而不是引用。

      因此,您的错误似乎可能是缺少 global 或误解了数组/对象分配的工作原理。 (实际上两者都是。)

      【讨论】:

        【解决方案5】:

        我知道这是一个旧线程,但我发现它试图解决与原始评论者相同的问题。最终,实际答案是被接受的答案的点点滴滴,但从未明确说明过。

        这是最终给我正确答案的链接:http://www.nusphere.com/kb/phpmanual/function.unset.htm?

        函数内部的 unset() 的行为可能会有所不同,具体取决于 你试图销毁什么类型的变量。

        如果一个全局变量在函数内部是 unset(),只有 局部变量被破坏。调用环境中的变量 将保留与调用 unset() 之前相同的值。

        如果您想在函数内取消设置()全局变量, 您可以使用 $GLOBALS 数组来执行此操作。

        实际的答案应该是这样的:

        function clearArray() {
          global $myArray;
          unset($GLOBALS['myArray']);
          $myArray =array();
        }
        

        【讨论】:

          猜你喜欢
          • 2014-03-10
          • 1970-01-01
          • 2020-09-21
          • 2017-04-06
          • 2020-05-10
          • 2020-03-02
          • 1970-01-01
          • 2011-08-20
          • 1970-01-01
          相关资源
          最近更新 更多