【问题标题】:Singleton isn't returning existing instance单例不返回现有实例
【发布时间】:2012-01-04 13:06:56
【问题描述】:

这就是我设置单身人士的方式

<?php
    class MySingleton
    {
        private static $instance;
        private static $you;

        private function __construct()
        {
            $this->you = "foo";     
        }

        public static function singleton()
        {
            if (!isset(self::$instance)) {              
                $className = __CLASS__;
                self::$instance = new $className;
            }
            return self::$instance;
        }

        public function getYou()
        {
            return $this->you;
        }       
        public function setYou($val)
        {
            $this->you = $val;
        }

    }
?>

file1.php,我这样做:

require_once('session.php');
$session = MySingleton::singleton();
$session->setYou('bar');
echo $session->getYou(); //echoes 'bar'

在 file1.php 中,我有一个指向 file2.php 的超链接,其中有以下代码:

require_once('session.php');
$session = MySingleton::singleton();
echo ($session->getYou()); //prints 'foo' which gets set in the constructor

它似乎正在为 file2 创建一个新实例,这就是为什么 $you 具有默认值 foo。我哪里错了?为什么我没有得到我在 file1.php 中使用的实例?

【问题讨论】:

  • 不幸的是,使用会话不是一个选项。该应用程序正在使用长轮询,这导致session_start 需要超过 30 秒的时间才能执行。我希望改用单例。我想我可以使用 cookie
  • 尝试使用 cookie,但同样的问题。这很有意义,因为 cookie 也使用文件。谢谢您的帮助。如果我无法弄清楚,我将创建另一个问题
  • 尝试使用信号量、共享内存或键/值存储代替

标签: php oop design-patterns singleton


【解决方案1】:

PHP 中的单例仅对当前请求有效(因为 HTTP 是无状态的)。

如果要保留该对象的状态,请将其保存在会话中:

class MySingleton
    {
        private static $instance;
        private static $you;

        private function __construct()
        {
            $this->you = "foo";     
        }

        public static function singleton()
        {
            session_start();
            if (!($_SESSION['MyInstance'] instanceof MySingleton)) {              
                $className = __CLASS__;
                $_SESSION['MyInstance'] = new $className;
            }
            return $_SESSION['MyInstance'];
        }

        public function getYou()
        {
            return $this->you;
        }       
        public function setYou($val)
        {
            $this->you = $val;
        }

    }

【讨论】:

    【解决方案2】:

    Singleton 在 ONE 请求期间是“单一的”。对于其他所有内容,您都必须序列化对象或使用 Sessions。

    【讨论】:

      【解决方案3】:

      静态数据仅适用于单个 PHP 程序。

      如果您的两个脚本作为单独的页面运行,它们将不会共享任何状态。

      【讨论】:

        【解决方案4】:

        PHP 中的单例旨在在程序的同一执行期间返回对象的相同实例,而不是在不同页面或页面加载之间。您需要将对象存储在会话中(将其发送到“睡眠”)并稍后检索它(“唤醒”),但要注意,它们仍然是不同的实例,一个是另一个的克隆,并且更新 une不会更新其他的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-17
          • 1970-01-01
          • 1970-01-01
          • 2017-04-28
          • 2016-10-21
          • 1970-01-01
          • 2018-06-30
          • 1970-01-01
          相关资源
          最近更新 更多