Variável estática dentro da função não pode conter referência a singleton
Eu notei um comportamento estranho com singletons no PHP, não há melhor maneira de explicar isso, mas com um exemplo.
Digamos que eu tenha a seguinte classe singleton:
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;
}
}
E a seguinte função:
function Test($Init = FALSE)
{
static $Instance;
if ($Init === TRUE && !isset($Instance)) {
$Instance =& Singleton::Instance();
}
echo 'Function Echo'.PHP_EOL;
var_dump($Instance);
return $Instance;
}
E quando eu uso o seguinte:
Test(TRUE);
Test();
Singleton::Instance();
A saída é:
Class Echo
NULL
Function Echo
object(Singleton)#1 (0) {
}
Function Echo
NULL
Class Echo
object(Singleton)#1 (0) {
}
Como você pode ver, a referência salva dentro da função é perdida após a execução, mesmo que a variável seja estática. Observe também que a variável estática dentro do método de classe está funcionando bem.
Isso é normal ou estou fazendo algo errado?