Zmienna statyczna wewnątrz funkcji nie może utrzymywać odniesienia do singletonu

Zauważyłem dziwne zachowanie w singletonach w PHP nie ma lepszego sposobu na wyjaśnienie tego, ale z przykładem.

Powiedzmy, że mam następującą klasę 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;
    }
}

I następująca funkcja:

function Test($Init = FALSE)
{
    static $Instance;

    if ($Init === TRUE && !isset($Instance)) {
        $Instance =& Singleton::Instance();
    }

    echo 'Function Echo'.PHP_EOL;
    var_dump($Instance);

    return $Instance;
}

A kiedy korzystam z następujących:

Test(TRUE);
Test();
Singleton::Instance();

Dane wyjściowe to:

Class Echo
NULL
Function Echo
object(Singleton)#1 (0) {
}
Function Echo
NULL
Class Echo
object(Singleton)#1 (0) {
}

Jak widać, zapisane odwołanie wewnątrz funkcji jest tracone po wykonaniu, nawet jeśli zmienna jest statyczna. Zauważ też, że zmienna statyczna wewnątrz metody klasy działa poprawnie.

Czy to ma być normalne, czy robię coś złego?

questionAnswers(2)

yourAnswerToTheQuestion