我注意到 PHP 中单例的奇怪行为没有更好的方法来解释这一点,但有一个例子。
假设我有以下单例类:
class Singleton
{
protected function __construct()
{
// Deny direct instantion!
}
protected function __clone()
{
// Deny cloning!
}
public static function &Instance()
{
static $Instance;
echo 'Class Echo'.PHP_EOL;
var_dump($Instance);
if (!isset($Instance)) {
$Instance = new self;
}
return $Instance;
}
}
以及以下功能:
function Test($Init = FALSE)
{
static $Instance;
if ($Init === TRUE && !isset($Instance)) {
$Instance =& Singleton::Instance();
}
echo 'Function Echo'.PHP_EOL;
var_dump($Instance);
return $Instance;
}
当我使用以下内容时:
Test(TRUE);
Test();
Singleton::Instance();
输出是:
Class Echo
NULL
Function Echo
object(Singleton)#1 (0) {
}
Function Echo
NULL
Class Echo
object(Singleton)#1 (0) {
}
如您所见,即使变量是静态的,执行后函数内部保存的引用也会丢失。另外请注意,类方法中的静态变量工作正常。
这应该是正常的还是我做错了什么?