Singleton不返回现有实例

时间:2012-01-04 13:06:56

标签: php oop design-patterns singleton

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

<?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中使用的实例?

4 个答案:

答案 0 :(得分:3)

在一个请求期间,单身人士应该是“单身”。对于其他一切,您必须序列化对象或使用Sessions。

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

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

    }

答案 3 :(得分:1)

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