Statische Variable innerhalb der Funktion kann keinen Verweis auf Singleton enthalten

Ich habe ein seltsames Verhalten mit Singletons in PHP bemerkt, es gibt keinen besseren Weg, dies zu erklären, als mit einem Beispiel.

Angenommen, ich habe die folgende Singleton-Klasse:

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;
    }
}

Und die folgende Funktion:

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

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

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

    return $Instance;
}

Und wenn ich folgendes benutze:

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

Die Ausgabe ist:

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

Wie Sie sehen, geht die gespeicherte Referenz in der Funktion nach der Ausführung verloren, obwohl die Variable statisch ist. Beachten Sie auch, dass die statische Variable in der Klassenmethode einwandfrei funktioniert.

Soll das normal sein oder mache ich was falsch?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage