PHP:使用Singleton模式和理解__clone方法的问题

时间:2012-01-30 22:55:30

标签: php reference singleton pass-by-reference

我正在尝试在php中实现单例模式,如示例#2中所述: http://www.php.net/singleton

当我运行示例代码

$singleton = Example::singleton(); // prints "Creating new instance."
echo $singleton->increment(); // 0
echo $singleton->increment(); // 1

$singleton = Example::singleton(); // reuses existing instance now
echo $singleton->increment(); // 2
echo $singleton->increment(); // 3

它始终以致命错误结束'不允许克隆。'直接在'创建新实例'之后。

我希望php没有理由调用__clone方法。 在我的另一个真实项目中,我希望有一个单独的PlayerManager,它将Player对象保存在一个数组中(在__construct中只加载一次),并具有GetPlayers()或GetPlayersByID($ id)等函数。

在我的脚本中,我写了类似

的内容
$pm = PlayerManager::GetInstance();
$p1 = $pm->GetPlayerByID(0);
echo $p1->SomeNumber; //100

$p1->SomeNumber = 200;
$p2 = $pm->GetPlayerByID(0);
echo $p2->SomeNumber; //100 and not 200, as I would expect

有人能给我一些提示如何使用Singleton模式正确实现PlayerManager吗?我不确定它是单独存在的问题还是返回对象引用的问题......

1 个答案:

答案 0 :(得分:1)

我不太确定你为什么会收到这个错误(如果你需要帮助,请发布你的单身课程)。虽然我总是喜欢这个版本,但是它更简单:http://www.talkphp.com/advanced-php-programming/1304-how-use-singleton-design-pattern.html

所以上面的代码看起来像是:

class Counter
{
    $CurrentValue = 0;

    // Store the single instance of Database 
    private static $m_pInstance; 

    private function __construct() { } 

    public static function getInstance() 
    { 
        if (!self::$m_pInstance) 
        { 
            self::$m_pInstance = new Counter(); 
        } 

        return self::$m_pInstance; 
    }

    public function increment ($by)
    {
        $this->CurrentValue += $by;
        return $this->CurrentValue;
    }
    public function getValue ()
    {
        return $this->CurrentValue;
    }
}

使用:

$counter = Counter::getInstance();
echo $counter->increment(); // 0
echo $counter->increment(); // 1

$counter = null;

$counter = Counter::getInstance(); // reuses existing instance now
echo $counter->increment(); // 2
echo $counter->increment(); // 3

告诉我这对你有什么用。