PHP静态不那么静态

时间:2011-02-12 08:38:59

标签: php static singleton

我注意到PHP中的关键字static根本不是static

让我们说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!

?>

我希望有人能就此启发我,谢谢!

3 个答案:

答案 0 :(得分:9)

因为在每个页面加载所有内存都被擦除了?

答案 1 :(得分:8)

静态作用域并不意味着它将永远保留在内存中,这意味着该变量在程序调用堆栈之外运行,并且在脚本执行期间将保持不变。程序结束后仍然会被清除。

答案 2 :(得分:3)

这是因为每次进行页面加载时,它都会单独运行{main}。这就像两次运行java程序并且不保留静态属性。 Elmo :: $ instance只会在同一个脚本的上下文中保持实例化。如果您希望它在页面加载中工作,您可以在会话(或DB)中对其进行序列化,并在每次检查时而不是$ instance:

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;
}