PHP статический не такой статичный - PullRequest
0 голосов
/ 12 февраля 2011

Я заметил, что ключевое слово static в PHP совсем не то, что 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 ]

9 голосов
/ 12 февраля 2011

потому что при каждой загрузке страницы вся память стирается?

8 голосов
/ 12 февраля 2011

Статическая область видимости не означает, что она останется в памяти навсегда, это означает, что переменная работает за пределами стека вызовов программы и будет сохраняться во время выполнения сценария. Он все еще очищается после завершения программы.

3 голосов
/ 12 февраля 2011

Это потому, что каждый раз, когда вы загружаете страницу, она запускается {main} отдельно. Это все равно что запускать Java-программу два раза, а статическое свойство не сохраняется. Elmo :: $ instance будет оставаться экземпляром только в контексте того же скрипта. Если вы хотите, чтобы он работал при загрузке страниц, вы можете сериализовать его в сеансе (или БД) и каждый раз проверять это вместо $ 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;
}
...