:::

2. static是什麼?

  1. 解釋:靜態的意思,可以用來宣告一個函數或者變數,只要記得當一個函數或者變數被宣告為static時,他就具有唯一值的概念!!他就永遠只佔著那一組記憶體空間。不管該類別被new幾個object,該值永遠都會是一樣的!(還是不懂吧~)
  2. java:對於每一個相同類別所產生的物件來說,他們會擁有各自的資料成員(也可說是建立了各自的物件(Object),所以會有各自的資料成員),然而在某些情況下,你會發現這些物件間會擁有相同的資料成員!!
    以Ball類別(Class)為例,如果你打算使用到圓周率PI這個資料時,因為對於任何一個Ball的實例(Instance)而言,圓周率都是相同的,因此您不需要讓不同的Ball實例擁有各自圓周率這個資料成員。
    您可以將PI資料成員宣告為"static",被宣告為"static"的資料成員,又稱「靜態資料成員」,靜態成員是屬於類別所擁有,而不是個別的物件,您可以將靜態成員視為每個物件實例所共享的資料成員。要宣告靜態資料成員,只要在宣告資料成員時加上"static"關鍵字就可以了。
  3. php:當程式被執行的時候,php會將被Static 化的變數和函數存成一個獨立的方法或變數,這個時候你就可以直接使用這一個類別變數和類別函數。 PHP為了讓使用者更方便的重覆使用。預設的函數好像都會被定義成Static ,所以你就可以自由的叫用,無論你是不是設定成Static  ( 在Java程式設計中 只有設定為Static的函數才可以叫用),不過變數控制就和Java一樣會被鎖定只能使用Static的方式來呼叫。
  4. 靜態呼叫範例:

    (1)不用new一個物件,可直接取用

    <?php
    class static_ex {
      public static $iValue = 0;
    }
    //直接取得靜態變數
    echo static_ex::$iValue;
    //改變靜態變數值
    static_ex::$iValue=10;
    echo static_ex::$iValue;
    ?>

    (2)靜態變數V.S靜態函數

     <?php
    
     class 車子 {
       //類別變數
        public static $車型="Mazda! ";
       
       //類別函數
        public function  車單($車型){
          //引數 $車型 function 變數和上面的變數無關
            echo $車型;
        }
       
     }
     //用類別方法(靜態呼叫變數)
     echo 車子::$車型;
     
     //用類別方法(靜態呼叫函數)
     //Java不能這樣用
     車子::車單("Honda! ");
     
     //先產生一台車子
     $車子 = new 車子;
     
     //輸出車子裡面的 車型 實體化變數
     echo  $車子->車型;
     //Notthing 什麼也沒有(進入overloading)
    
     //使用車子裡面的函數
     $車子->車單("Toyota! ");
     
    ?> 
  5. 用途:static 主要用途在於定義一個變數空間,讓函式或類別可以保留住該變數的值,直到下次的存取。
    • 需要記住上一次函式執行的結果。
    • 某些可以保留執行結果的遞迴函式。
    • 不希望因為物件個體不同,進而被影響的類別屬性。
    • 類別的 Singleton 模式。
  6. 應用:應用在遞迴上的 static 關鍵字
    // PHP 版的 Fibonacci Sequence 遞迴函式
    function fibV2($n)
    {
        static $result = array();
        if (!isset($result[$n])) {
            if ($n <= 2) {
                $result[$n] = 1;
            } else {
                $result[$n] = fibV2($n - 2) + fibV2($n - 1);
            }
        }
        return $result[$n];
    }
    
    $start_time = (float) microtime(true);
    echo fibV2(20), "\n";
    $end_time = (float) microtime(true);
    echo "Spent Time: ", ($end_time - $start_time), "(s)\n";
    /* output:
    6765
    Spent Time: 0.0009009838104248(s)
    */
    
  7. 參考資料:

    (1)http://www.php5.idv.tw/html.php?mod=article&do=show&shid=75

    (2)http://www.jaceju.net/blog/archives/670/

    (3)http://andys0623.blogspot.tw/2012/08/static-c.html

    (4)http://blog.kenyang.net/2011/03/java-staticfinal.html