首先咱先看到例子,最簡單不過的執行流程了:
Example 1: gc.php
<?php
error_reporting(E_ALL);
$a = 'I am test.';
$b = & $a;
echo $b ." ";
?>
不用說 % php -f gc.php 輸出結果非常明了:
hy0kl% php -f gc.php
I am test.
好,下一個:
Example 2:
<?php
error_reporting(E_ALL);
$a = 'I am test.';
$b = & $a;
$b = 'I will change?';
echo $a ." ";
echo $b ." ";
?>
執行結果依然很明顯:
hy0kl% php -f gc.php
I will change?
I will change?
君請看:
Example 3:
<?php
error_reporting(E_ALL);
$a = 'I am test.';
$b = & $a;
unset($a);
echo $a ." ";
echo $b ." ";
?>
是不是得想一下下呢?
hy0kl% php -f gc.php
Notice: Undefined variable: a in /usr/local/www/apache22/data/test/gc.php on line 8
I am test.
有點犯迷糊了嗎?
君再看:
Example 4:
<?php
error_reporting(E_ALL);
$a = 'I am test.';
$b = & $a;
unset($b);
echo $a ." ";
echo $b ." ";
?>
其實如果 Example 3 理解了,這個與之異曲同工.
hy0kl% php -f gc.php
I am test.
Notice: Undefined variable: b in /usr/local/www/apache22/data/test/gc.php on line 9
君且看:
Example 5:
<?php
error_reporting(E_ALL);
$a = 'I am test.';
$b = & $a;
Notice: Undefined variable: a in /usr/local/www/apache22/data/test/gc.php on line 10
$a =
$b = I am test.
第一次 unset() 的操作已經斷開了指向,所以後繼的操作不會對符號表的任何記憶體的引用記數造成影響了.