我正在尝试在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吗?我不确定它是单独存在的问题还是返回对象引用的问题......
答案 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
告诉我这对你有什么用。