2014-01-30 21 views
14

Einige meiner Klassen deklarieren ihre Konstruktoren als privat, weil ein Objekt einer solchen Klasse nur von einer statischen Methode der Klasse erzeugt werden darf. Darf ich Destruktoren solcher Klassen auch als privat deklarieren, um sie symmetrisch zu halten? Ist sie sicher?Ist es in Ordnung, Destruktor als privat zu deklarieren?

EDIT: Ok, wie dies scheint einfach nicht möglich:

Fatal error: Call to private AClass::__destruct() from context '' in /script on line 0 

(der Kontext ist leer und es gibt nicht so etwas wie die Zeile 0). Aus irgendeinem Grund dachte ich, dass die PHP-Laufzeit allmächtig ist und alles zerstören kann, was sie will.

Antwort

15

in PHP die __destruct magische Methode musspublic sein. Die Methode wird automatisch extern zur Instanz aufgerufen. Wenn Sie __destruct als protected oder private deklarieren, wird eine Warnung ausgegeben und die magische Methode wird nicht aufgerufen.

Es ist keine Symmetrie erforderlich, da Sie niemals explizit __destruct aufrufen sollten.

+0

Schwerwiegender Fehler: Aufruf von privat Foo :: __ destruct() aus dem Kontext bei der Deklaration als privat – zloctb

2

Scheint, dass Sie das Singleton-Muster implementieren. In diesem Muster muss der Konstruktor privat sein und Sie haben eine statische Methode, die eine Instanz der Klasse zurückgibt. Wenn es keine Instanz gibt, erstellt diese statische Methode sie und gibt sie zurück.

Wenn Sie den Destruktorzugriff auf "privat" setzen, erlauben Sie anderen Klassen oder Funktionen nicht, diese Instanz zu zerstören. Dies könnte inkonsistent sein, wenn Sie diese Instanz an einem Punkt der Ausführung Ihrer Anwendung nicht mehr verwenden. Es gibt keinen Grund, den Destruktor auf "privat" zu setzen, denn selbst wenn es öffentlich ist, kann die statische Methode eine neue Instanz zurückgeben, wenn niemand da ist.

+0

Sie müssen immer noch vorsichtig mit der Synchronisierung des singleton Zeiger/slot in der Klassendefinition über den statischen Getter und den Destruktor sein. Ich möchte nicht, dass der statische Getter den Singleton zurückgibt, bevor er zerstört wird. – atk

+0

Beachten Sie auch, dass das Singleton-Muster in den meisten (nicht allen) Fällen ein sehr schlechtes Muster ist und viele Designprobleme verursacht. Es ist auch nicht möglich, mit ihnen eine ordnungsgemäße Geräteprüfung durchzuführen. – ToBe

+0

Es ist so implementiert, um das Überladen von Funktionen mit mehreren statischen Methoden beim Konstruieren eines Objekts der Klasse zu simulieren (Überladen wird in PHP nicht unterstützt) –

Verwandte Themen