Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“怎么做?”;真的吗;清除全局PHP数组_Php - Fatal编程技术网

“怎么做?”;真的吗;清除全局PHP数组

“怎么做?”;真的吗;清除全局PHP数组,php,Php,注意:似乎我对发生的事情错了,使用$a=array()没有问题。这是因为对数组的所有赋值都是按副本进行的。(我原以为有一些引用访问会引起问题,但那只是一个输入错误。我在下面的答案中添加了一些细节。) 我有一些PHP,看起来像这样: $myArray = array(); function useArray() { global $myArray; // ... do something with myArray ... } function clearArray() { glob

注意:似乎我对发生的事情错了,使用
$a=array()没有问题。这是因为对数组的所有赋值都是按副本进行的。(我原以为有一些引用访问会引起问题,但那只是一个输入错误。我在下面的答案中添加了一些细节。)

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

$myArray = array();

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

function clearArray() {
  global $myArray;
  // ... Somehow clear the global array ...
}
function clearArray() {
  global $myArray;
  foreach($key in array_keys($myArray) ) {
     unset( $myArray[$key] );
  }
}
function clearArray() {
  global $myArray;
  unset($GLOBALS['myArray']);
  $myArray =array();
}
我知道从设计的角度来看这很糟糕,但它需要处理一些我无法更改的第三方代码

我的问题是,我可以在
clearArray
函数中添加什么使其工作? 使用
$myArray=array();
unset($myArray);
的常用建议不起作用,因为它们只更改本地版本,而不更改全局版本。我想我可以循环数组中的键并依次取消设置-如下所示:

$myArray = array();

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

function clearArray() {
  global $myArray;
  // ... Somehow clear the global array ...
}
function clearArray() {
  global $myArray;
  foreach($key in array_keys($myArray) ) {
     unset( $myArray[$key] );
  }
}
function clearArray() {
  global $myArray;
  unset($GLOBALS['myArray']);
  $myArray =array();
}

但这似乎有些老套和不清楚。有更好的解决方案吗?

别忘了有两种方法可以访问全局变量:

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

使用
$myArray=array();
取消设置($myArray);
的通常建议显然有效

您可以通过引用传递:

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

PHP的数组分配是通过复制的(而对象分配是通过引用的)。这意味着许多您认为存在的漏洞根本不存在

下面是一个简单的例子:

$a = array("A");
$b = &$a;
$c = $a;


function clear1() {
  global $a;
  $a = array();
}

clear1();
print(json_encode(array($a,$b,$c))."\n"); 
这将输出<代码>[]、[]、[“A”]]
。使用您的帖子中的清除可以获得相同的结果

function clear2(){
  global $a;
  foreach(array_keys($a) as $key) {
    unset( $a[$key] );
  }
}
$b
时,
$c
未被清除的原因是,
$c
$a
的深度副本(数组赋值的默认值),而
$c
是对
$a
的引用。关键是数组是值,而不是引用


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

我知道这是一条老线索,但我发现它试图解决与原始评论者相同的问题。最终,实际答案是接受答案的零碎部分,但从未明确说明

这是最终给我正确答案的链接:

函数中unset()的行为可能因时间而异 您试图销毁的变量类型

如果全球化变量在函数内部为unset(),则只有 局部变量已销毁。调用环境中的变量 将保留与调用unset()之前相同的值

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

实际答案应该如下所示:

$myArray = array();

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

function clearArray() {
  global $myArray;
  // ... Somehow clear the global array ...
}
function clearArray() {
  global $myArray;
  foreach($key in array_keys($myArray) ) {
     unset( $myArray[$key] );
  }
}
function clearArray() {
  global $myArray;
  unset($GLOBALS['myArray']);
  $myArray =array();
}

这个“黑客”版本有效吗?
$myArray=[]
有效--您得到了不同的结果吗?我的测试表明,
$myArray=array();
工作正常-您遇到了什么问题?请检查:[php<5.3垃圾收集,数组值是否需要设置为null,或者设置array=null会使其所有元素孤立?][1],也许这将有助于回答你的问题。[1]:@SmokeyHP-你完全正确。我对数组分配与对象分配的一些混淆,加上部分代码中缺少“全局”导致我得出错误的结论。
unset($myArray)
可能很明显,但它肯定不起作用。