2011-02-12 71 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; 
}