$countries = [
<code> [ '0' => [ 'id' =>0 ] ], [ '1' => [ 'id' =>1 ] ], </p> <p>];<br>foreach($countries를 $key => $value) {</p> <pre class="brush:php;toolbar:false"><code>print_r(current($countries)); echo '下一个'; print_r(pos($countries)); next($countries); echo PHP_EOL; </code>
}
?>
$countries = [
<code> [ '0' => [ 'id' =>0 ] ], [ '1' => [ 'id' =>1 ] ], </p> <p>];<br>foreach($countries를 $key => $value) {</p> <pre class="brush:php;toolbar:false"><code>print_r(current($countries)); echo '下一个'; print_r(pos($countries)); next($countries); echo PHP_EOL; </code>
}
?>
foreach 루프에 정의된 $countries
과 $countries
은 동일한 zval 변수를 가리킵니다. 왜냐하면 PHP는 메모리를 절약하고 동일한 데이터를 두 번 저장할 필요가 없기 때문입니다. 이때 zval의 refcount
은 2입니다. 그러나 루프에서 $countries
이 변경되면 예를 들어
<code class="php"> foreach ($countries as &$country) { $country = 'china'; //因为这里进行了赋值操作, 这里发生了copy-on-write }</code>
또는
<code class="php">foreach ($countries as $country) { echo current($countries); //因为current是要传引用的, 这里发生了copy-on-write }</code>
은 참조를 전달하고 copy-on-write
작업을 트리거하는 값을 할당합니다. 이 작업은 zval이 복사되고 원본 zval의 refcount
은 1로 줄어듭니다.
루프할 때마다 current가 실행되므로 모든 루프가 발생합니다copy-on-write
. 따라서 current가 새 zval을 작동할 때마다
이 답변을 찾고 있습니다