为什么我需要在 foreach 循环后取消设置 $value
Why do I need unset $value after foreach loop
我在 PHP 中使用数组,我对 unset() 函数感到困惑,这里是代码:
<?php
$array = array(1, 2, 3, 4);
foreach ($array as $value) {
$value + 10;
}
unset($value);
print_r($array);
?>
是否有必要取消设置($value),当$value 在foreach 循环后仍然存在时,是一种好的做法吗?
在您使用它的当前上下文中不需要使用 unset
。 unset
只会破坏变量及其内容。
在您给出的示例中,这是循环创建一个数组 $value
,然后您将取消设置该变量。这意味着它不再存在于该代码中。所以这绝对没有任何作用。
为了形象化我在说什么,请看这个例子:
$value = 'Hello World';
echo $value;
unset($value);
echo $value;
下面将是:
Hello World<br /><b>NOTICE</b> Undefined variable: value on line number 6<br />
因此您首先会看到 Hello World
,但在取消设置该变量后尝试调用它只会导致错误。
要回答您的问题,您真的不必取消设置值;没有必要。由于 foreach
循环正在为每个 array() + 10
.
设置一个 $value
取消设置会导致作品被删除和遗忘。
<?php
$array = array(1, 2, 3, 4);
foreach ($array as &$value) {
$value = $value + 10;
}
unset($value);
print_r($array);
你泄露了"&"
,也许。
我知道这个 post 是旧的,但我认为这个信息非常重要:
你问:
Is it necessary to unset($value), when $value remains after foreach
loop, is it good practice?
这取决于你是按值还是按引用迭代。
第一种情况(按值):
$array = array(1, 2, 3, 4);
foreach ($array as $value) {
//here $value is 1, then 2, then 3, then 4
}
//here $value will continue having a value of 4
//but if you change it, nothing happens with your array
$value = 'boom!';
//your array doesn't change.
因此没有必要取消设置 $value
第二种情况(引用):
$array = array(1, 2, 3, 4);
foreach ($array as &$value) {
//here $value is not a number, but a REFERENCE.
//that means, it will NOT be 1, then 2, then 3, then 4
//$value will be $array[0], then $array[1], etc
}
//here $value it's not 4, it's $array[3], it will remain as a reference
//so, if you change $value, $array[3] will change
$value = 'boom!'; //this will do: $array[3] = 'boom';
print_r ($array); //Array ( [0] => 1 [1] => 2 [2] => 3 [3] => boom! )
因此,在这种情况下,取消设置 $value 是一个很好的做法,因为这样做会破坏对数组的引用。 有必要吗?没有,但是如果不做,就要非常小心了。
它可能会导致像这样的意外结果:
$letters = array('a', 'b', 'c', 'd');
foreach ($letters as &$item) {}
foreach ($letters as $item) {}
print_r ($letters); //output: Array ( [0] => a [1] => b [2] => c [3] => c )
// [a,b,c,c], not [a,b,c,d]
这也适用于PHP 7.0
未设置的相同代码:
$letters = array('a', 'b', 'c', 'd');
foreach ($letters as &$item) {}
unset ($item);
foreach ($letters as $item) {}
print_r ($letters); //output: Array ( [0] => a [1] => b [2] => c [3] => d )
// now it's [a,b,c,d]
我希望这对以后的人有用。 :)
我在 PHP 中使用数组,我对 unset() 函数感到困惑,这里是代码:
<?php
$array = array(1, 2, 3, 4);
foreach ($array as $value) {
$value + 10;
}
unset($value);
print_r($array);
?>
是否有必要取消设置($value),当$value 在foreach 循环后仍然存在时,是一种好的做法吗?
在您使用它的当前上下文中不需要使用 unset
。 unset
只会破坏变量及其内容。
在您给出的示例中,这是循环创建一个数组 $value
,然后您将取消设置该变量。这意味着它不再存在于该代码中。所以这绝对没有任何作用。
为了形象化我在说什么,请看这个例子:
$value = 'Hello World';
echo $value;
unset($value);
echo $value;
下面将是:
Hello World<br /><b>NOTICE</b> Undefined variable: value on line number 6<br />
因此您首先会看到 Hello World
,但在取消设置该变量后尝试调用它只会导致错误。
要回答您的问题,您真的不必取消设置值;没有必要。由于 foreach
循环正在为每个 array() + 10
.
$value
取消设置会导致作品被删除和遗忘。
<?php
$array = array(1, 2, 3, 4);
foreach ($array as &$value) {
$value = $value + 10;
}
unset($value);
print_r($array);
你泄露了"&"
,也许。
我知道这个 post 是旧的,但我认为这个信息非常重要: 你问:
Is it necessary to unset($value), when $value remains after foreach loop, is it good practice?
这取决于你是按值还是按引用迭代。
第一种情况(按值):
$array = array(1, 2, 3, 4);
foreach ($array as $value) {
//here $value is 1, then 2, then 3, then 4
}
//here $value will continue having a value of 4
//but if you change it, nothing happens with your array
$value = 'boom!';
//your array doesn't change.
因此没有必要取消设置 $value
第二种情况(引用):
$array = array(1, 2, 3, 4);
foreach ($array as &$value) {
//here $value is not a number, but a REFERENCE.
//that means, it will NOT be 1, then 2, then 3, then 4
//$value will be $array[0], then $array[1], etc
}
//here $value it's not 4, it's $array[3], it will remain as a reference
//so, if you change $value, $array[3] will change
$value = 'boom!'; //this will do: $array[3] = 'boom';
print_r ($array); //Array ( [0] => 1 [1] => 2 [2] => 3 [3] => boom! )
因此,在这种情况下,取消设置 $value 是一个很好的做法,因为这样做会破坏对数组的引用。 有必要吗?没有,但是如果不做,就要非常小心了。
它可能会导致像这样的意外结果:
$letters = array('a', 'b', 'c', 'd');
foreach ($letters as &$item) {}
foreach ($letters as $item) {}
print_r ($letters); //output: Array ( [0] => a [1] => b [2] => c [3] => c )
// [a,b,c,c], not [a,b,c,d]
这也适用于PHP 7.0
未设置的相同代码:
$letters = array('a', 'b', 'c', 'd');
foreach ($letters as &$item) {}
unset ($item);
foreach ($letters as $item) {}
print_r ($letters); //output: Array ( [0] => a [1] => b [2] => c [3] => d )
// now it's [a,b,c,d]
我希望这对以后的人有用。 :)