首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 變數進階:可變變數、引用賦值與銷毀機制深度解析

     編輯:PHP 相關知識

    核心概念速覽

    • 可變變數:以一個變數的值作為另一個變數的名稱($$var)
    • 引用賦值:& 符號建立別名,兩個變數指向同一記憶體位址
    • 銷毀機制:unset() 僅移除變數名稱綁定,不直接釋放記憶體(引用計數歸零才會回收)

    程式碼逐行解析

    <?php
    // 1. 建立基礎變數
    $long = "big_long_variable_name";
    $$long = "PHP";          // 等同於 $big_long_variable_name = "PHP";
    
    // 2. 引用賦值:$short 成為 $big_long_variable_name 的別名
    $short = & $big_long_variable_name;  
    // 此時 $short、$big_long_variable_name、$$long 三者指向同一記憶體
    
    print "01 \$short is $short.";      // 輸出:01 $short is PHP.
    print "02 Long is $big_long_variable_name."; // 輸出:02 Long is PHP.
    
    ?>
    <br /><br />
    <?php
    // 3. 修改引用變數的值(字串串接)
    $big_long_variable_name .= " rocks!"; 
    // 因為是引用關係,$short 同步改變
    
    print "03 \$short is $short";       // 輸出:03 $short is PHP rocks!
    print "04 Long is $big_long_variable_name"; // 輸出:04 Long is PHP rocks!
    
    ?>
    <br /><br />
    05 $short is PHP rocks! 06 Long is PHP rocks!
    <br /><br />
    <?php
    // 4. 透過 $short 修改值,引用鏈上所有變數同步更新
    $short .= "Programming $short"; 
    print "07 \$short is $short";       // 輸出:07 $short is PHP rocks!Programming PHP rocks!
    print "08 Long is $big_long_variable_name"; // 輸出:08 Long is PHP rocks!Programming PHP rocks!
    
    ?>
    <br /><br />
    09 $short is Programming PHP rocks! 10 Long is Programming PHP rocks!
    <br /><br />
    <?php
    // 5. 再次透過原始變數修改
    $big_long_variable_name .= "Web Programming $short";
    print "11 \$short is $short";       // 輸出同步更新
    print "12 Long is $big_long_variable_name";
    
    ?>
    <br /><br />
    <?php
    // 6. 銷毀其中一個引用變數
    unset($big_long_variable_name); 
    // $short 不受影響,仍保留最後值
    print "13 \$short is $short";       // 輸出:13 $short is PHP rocks!Programming PHP rocks!Web Programming PHP rocks!Programming PHP rocks!
    print "14 Long is $big_long_variable_name."; // 輸出:14 Long is. (變數已不存在)
    
    ?>
    <br /><br />
    <?php
    // 7. 一般賦值與字串插值示範
    $short = "No point TEST1";          // 覆寫而非串接
    print "15 \$short is $short.";      // 輸出:15 $short is No point TEST1.
    $short = "No point TEST2 $short";   // 雙引號內變數解析
    print "16 \$short is $short.";      // 輸出:16 $short is No point TEST2 No point TEST1.
    ?>

    關鍵行為總結表

    操作語法記憶體行為影響範圍
    一般賦值$a = $b複製值 (Copy-on-Write)獨立
    引用賦值$a = &$b共享同一 zval 容器同步變更
    可變變數$$name動態建立/存取變數視情況
    銷毀變數unset($a)移除符號表項目,引用計數 -1僅移除該名稱

    實務開發建議

    1. 謹慎使用引用:除非明確需要共享狀態(如大型陣列遍歷修改),否則優先使用值傳遞,降低副作用風險。
    2. 可變變數限制場景:僅用於模板引擎、動態屬性存取等受控場景,避免程式碼難以追蹤。
    3. 理解 Copy-on-Write:PHP 內核採用寫時複製機制,一般賦值不會立即複製記憶體,只有發生寫入時才分離。
    4. unset 非釋放記憶體:若變數仍有其他引用存在,unset 後記憶體不會立即回收。

    掌握這些機制,能幫助你寫出更可預測、記憶體效率更高的 PHP 程式碼。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved