PHP的靜態變數的注意細節

來源:互聯網
上載者:User

只要在變數前加上關鍵字static,該變數就成為靜態變數了。

<?php
  function test()
  {
    static $nm = ;
    $nm = $nm * ;
    print $nm."<br />";
  }
  // 第一次執行,$nm = 
  test();
  // 第一次執行,$nm = 
  test();
  // 第一次執行,$nm = 
  test();
?>

程式運行結果:
1
2
2
4
3
8


函數test()執行後,變數$nm的值都儲存了下來了。

在class中經常使用到靜態屬性,比如靜態成員、靜態方法。

之前的公司的小兄弟要去面試PHP,他遇到了一道PHP基礎面試題,大致內容是如下:

function test(){
   static $a = 0;
   $a++;
   echo "before unset ".$a."<br/>";
   unset($a);
   $a = 23;
   echo "after unset ".$a."<br/>";
}
test();
test();
test();

看到這題的時候,就注意到了stats這個標記了$a。就知道這題不會是第一反應的結果。(結果如下)

PHP運行結果

這個$a 值沒有因為unset() 函數改變,而是一直在累計!!我知道unset()對應static狀態的變數是無效的。我馬上查看了手冊
unset() 銷毀指定的變數。
unset() 在函數中的行為會依賴於想要銷毀的變數的類型而有所不同。
如果在函數中  unset() 一個全域變數,則只是局部變數被銷毀,而在調用環境中的變數將保持調用  unset() 之前一樣的值。
如果在函數中  unset() 一個靜態變數,那麼在函數內部此靜態變數將被銷毀。但是,當再次調用此函數時,此靜態變數將被複原為上次被銷毀之前的值。

其實這樣這麼理解:

PHP變數關係圖

PHP的記憶體位址跟變數直接就是通過這種方式進行關聯的。一般的變數是是通過關聯的方式指向對應的地址,而不是真是的值。所以unset()的過程,其實是斷了之間的聯絡,而不是抹掉了記憶體位址的值。
而static在初始設定變數的,僅在局部函數域中存在,但當程式執行離開此範圍時,其值並不丟失。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.