“怎么做?”;真的吗;清除全局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)
可能很明显,但它肯定不起作用。