PHP指针和变量冲突

nIc*_*IcO 9 php pointers

我有一个关于PHP以及指针和变量的使用的问题.

以下代码产生了我不希望的东西:

<?php
$numbers = array('zero', 'one', 'two', 'three');

foreach($numbers as &$number)
{
  $number = strtoupper($number);
}

print_r($numbers);

$texts = array();
foreach($numbers as $number)
{
  $texts[] = $number;
}

print_r($texts);
?>
Run Code Online (Sandbox Code Playgroud)

输出如下

Array
(
    [0] => ZERO
    [1] => ONE
    [2] => TWO
    [3] => THREE
)
Array
(
    [0] => ZERO
    [1] => ONE
    [2] => TWO
    [3] => TWO
)
Run Code Online (Sandbox Code Playgroud)

注意'TWO'在第二个数组中出现两次.

似乎两个foreach循环之间存在冲突,每个循环都声明一个$ number变量(一次是引用,另一次是值).

但为什么 ?为什么它只影响第二个foreach中的最后一个元素?

Álv*_*lez 4

关键是PHP没有指针。它有references,这是一个相似但不同的概念,并且存在一些细微的差异。

如果您使用var_dump()而不是 print_r(),则更容易发现:

$collection = array(
    'First',
    'Second',
    'Third',
);

foreach($collection as &$item){
    echo $item . PHP_EOL;
}

var_dump($collection);

foreach($collection as $item){
    var_dump($collection);
    echo $item . PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)

... 印刷:

First
Second
Third
array(3) {
  [0]=>
  string(5) "First"
  [1]=>
  string(6) "Second"
  [2]=>
  &string(5) "Third"
}
array(3) {
  [0]=>
  string(5) "First"
  [1]=>
  string(6) "Second"
  [2]=>
  &string(5) "First"
}
First
array(3) {
  [0]=>
  string(5) "First"
  [1]=>
  string(6) "Second"
  [2]=>
  &string(6) "Second"
}
Second
array(3) {
  [0]=>
  string(5) "First"
  [1]=>
  string(6) "Second"
  [2]=>
  &string(6) "Second"
}
Second
Run Code Online (Sandbox Code Playgroud)

请注意&最后一个数组项中留下的符号。

总而言之,每当您在循环中使用引用时,最好在最后删除它们:

<?php

$collection = array(
    'First',
    'Second',
    'Third',
);

foreach($collection as &$item){
    echo $item . PHP_EOL;
}
unset($item);

var_dump($collection);

foreach($collection as $item){
    var_dump($collection);
    echo $item . PHP_EOL;
}
unset($item);
Run Code Online (Sandbox Code Playgroud)

...每次都会打印预期的结果。