PHP中Singleton类的多个实例

时间:2012-01-20 05:46:27

标签: php web-applications singleton

我在PHP中有以下Singleton类。

class CounterBalance{
    private static $instance;

    private $counterBalance;

    private function __construct(){ 
        $this->counterBalance = mt_rand(1, 4);      
    }

    // Getter method for creating/returning the single instance of this class
    public final static function getInstance() {
        if(!self::$instance) {
            self::$instance = new CounterBalance();
            echo "CounterBalance constructed <br/>";
        }
        return self::$instance;
    }

    public function getCounterBalanceValue() {
        return $this->counterBalance;
    }

}

但是在课堂上我做了类似

的事情
CounterBalance::getInstance()->getCounterBalanceValue();

在同一个php页面上,它可以正常工作。但它不能跨页面正常工作。当我在后续的php页面中执行相同的函数调用时,我得到了多个CounterBalance实例。

任何人都可以解释为什么会发生这种情况。

提前致谢。

1 个答案:

答案 0 :(得分:6)

欢迎来到无状态的HTTP世界。

单例只能持久保存单页加载(或任何其他PHP数据结构)。当php进程死掉时,单例就会死掉。下次加载页面时,将再次创建单例。单身人士只在该单一过程的背景下存活。如果您在单个脚本执行期间尝试创建它的十个实例,则可以维护单个实例。

如果您需要跨页面的数据持久性,则必须实现状态代理。例如,$_SESSION$_GET超全局或在数据库中存储数据(例如),并在后续页面加载时重新检索它。