php變數與對象的疑問

來源:互聯網
上載者:User
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在迴圈裡下斷點,一圈圈看變數值。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.