【问题标题】:PHP static not so staticPHP静态不是那么静态
【发布时间】:2011-02-12 08:38:59
【问题描述】:

我注意到 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!

?>

希望有人能指教一下,谢谢!

【问题讨论】:

标签: php static singleton


【解决方案1】:

因为在每次页面加载时都会擦除所有内存?

【讨论】:

  • 所以到达static 我需要的唯一方法是将其推入会话中......?
  • 这就是会话的用途——页面请求之间的数据持久性
  • 我不确定您是否可以在会话中保存对象(试一试)。 static 和其他方法只在渲染时存在,这就是为什么像 php 这样的脚本语言不会吃掉你的服务器,而且你不需要知道任何关于内存管理的知识来编写它。
  • 是的,您可以在会话中存储对象。您只需要确保在再次从会话中加载它们时定义它们的类型(类),否则您最终会得到一个 __PHP_Imcomplete_Class。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是因为每次加载页面时它都会单独运行 {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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      相关资源
      最近更新 更多