class a {}for ($i=0; $i < 3; $i++) { $a = new a; var_dump($a); echo "
";}
輸出結果:
object(a)#1 (0) { }
object(a)#2 (0) { }
object(a)#1 (0) { }
我想問為什麼是 #1,#2,#1 呢?
回複內容:
class a {}for ($i=0; $i < 3; $i++) { $a = new a; var_dump($a); echo "
";}
輸出結果:
object(a)#1 (0) { }
object(a)#2 (0) { }
object(a)#1 (0) { }
我想問為什麼是 #1,#2,#1 呢?
第一次運行 new a,建立了一個對象。
第二次運行new a,又建立了一個對象。
然後重新賦值給$a之後,第一個對象沒用了,就回收了。
然後回收留出來的坑,就留給第三次運行new a產生的對象。
你可以實驗下,加了 unset後就一致了
class a {}for ($i=0; $i < 3; $i++) { $a = new a; var_dump($a); echo "
"; unset($a);}
深入的話,可以找GC(Garbage collection)方面的資料。
#1中數位含義是執行個體ID(instance id),即類被執行個體化之後對應的編號,又稱為對象編號。
- PHP自動記憶體回收,使用“引用計數”的方式去確定是否銷毀變數,官網有非常詳細的解釋。
- 你的問題不在於對象使用,而在於如何對
$a進行計數,第一次迴圈,變數$a計數為1,指向#1對象,第二次迴圈由於已經脫離了第一次迴圈$a的範圍(精英王子 · 3小時前:『第二次迴圈由於已經脫離了第一次迴圈$a的範圍』的說法不正確,PHP 裡面迴圈是不會建立新的範圍的,銷毀第一次的 $a 是因為它被重新賦值。),所以經曆了建立對象#2、銷毀第一次建立的$a、建立第二次$a、賦值對象#2給$a、清Null 物件#1幾個步驟,很遺憾我水平難以講明白他們之間細微的前後關係。但值得肯定的是對象#2建立時,第一次迴圈的#1還尚未銷毀,否則他就會以#1為編號了。
因為主要是變數範圍、計數的問題,所以跟unset差不多的協助理解的方式:
//給變數命不同的名,不讓它們在迴圈結束之前涉及到計數和銷毀的問題
for ($i=0; $i < 3; $i++) {
$name = 'n' . $i;
${$name} = new stdClass();
var_dump(${name});
}
非常尊敬你研究的精神,但個人覺得這種知識的使用情境在PHP中並不太多,瞭解就好,沒必要深究,裝上xdebug外掛程式,用xdebug_debug_zval('a')可以詳細的看到變數的計數,或者用IDE在迴圈裡下斷點,一圈圈看變數值。