2011-02-12 108 views
0

我注意到PHP中的關鍵字static根本就不是staticPHP靜態不是那麼靜態

比方說Elmo是我的單身:

class Elmo 
{ 
    private static $instance; 

    private function __construct() 
    { 
     echo 'Elmo says constructor\n'; 
    } 

    public static function getInstance() 
    { 
     if (!isset(self::$instance)) 
      self::$instance = new Elmo(); 

     return self::$instance; 
    } 

    public function boo() 
    { 
     echo 'Elmo says boo!\n'; 
    } 
} 

而下面的文件只是一個普通的.php腳本。

<?php 

    Elmo::getInstance()->boo(); 
    Elmo::getInstance()->boo(); 

    // Output: 
    // Elmo says constructor 
    // Elmo says boo! 
    // Elmo says boo! 

?> 

重新構建每個新頁面Elmo。爲什麼後續頁面沒有以下輸出?

<?php 

    // Output: 
    // Elmo says boo! 
    // Elmo says boo! 

?> 

我希望有人能夠在這方面給我啓發,謝謝!

+1

這就是你不想在PHP中使用Singletons的原因之一。當沒有共享的應用程序內存時,這是毫無意義的。請參閱http://stackoverflow.com/questions/4595964/who-needs-singletons/4596323#4596323 – Gordon 2011-02-12 09:12:07

+5

static!== persistent – 2011-02-12 10:37:28

回答

8

靜態範圍並不意味着它會留在記憶永遠,這意味着該變量在程序調用堆棧之外運行,並且在腳本執行期間將持續存在。程序結束後仍然清除。

9

因爲在每一頁上加載的所有內存都被擦掉了?

3

這是因爲每次您執行頁面加載時,都會分別運行{main}。這將像兩個不同的時間運行一個Java程序,並且靜態屬性不被保留。 Elmo :: $實例只會在同一個腳本的上下文中保持實例化。如果你想讓它在整個頁面加載工作,你可以把它序列化的會話(或DB)和檢查,而不是$例如,這每一次:

const SESSION = 'session'; 
public static function inst() { 
    !isset($_SESSION[self::SESSION]) and self::init(); 
    self::$inst = $_SESSION[self::SESSION]; 
    return self::$inst; 
} 
private static function init() { 
    $_SESSION[self::SESSION] = new self; 
}