Ich möchte eine statische Klasse in PHP erstellen und sie sich wie in C # verhalten lassen
- Der Konstruktor wird beim ersten Aufruf der Klasse automatisch aufgerufen
- Keine Instanziierung erforderlich
So etwas ...
static class Hello {
private static $greeting = 'Hello';
private __construct() {
$greeting .= ' There!';
}
public static greet(){
echo $greeting;
}
}
Hello::greet(); // Hello There!
php
design-patterns
oop
static
Aleemb
quelle
quelle
Antworten:
Sie können statische Klassen in PHP haben, aber sie rufen den Konstruktor nicht automatisch auf (wenn Sie versuchen, ihn aufzurufen
self::__construct()
, wird eine Fehlermeldung angezeigt).Daher müssten Sie eine
initialize()
Funktion erstellen und in jeder Methode aufrufen:quelle
Therefore you'd have to create an initialize() function and call it in each method:
wäre es einfacher,initialize
eine öffentliche Funktion zu erstellen und sie direkt nach der Deklaration der Klasse aufzurufen.__callStatic
, wird es zuerst aufgerufen . Dort können Sie sehen, ob es initialisiert wurde, und dann tunself::$method
oder was auch immer Sie aufrufen. Wenn die Methode immer noch direkt aufgerufen wird, ändern Sie alles in privat und sehen Sie dort.Zusätzlich zu Gregs Antwort würde ich empfehlen, den Konstruktor auf privat zu setzen, damit es unmöglich ist, die Klasse zu instanziieren.
Meiner bescheidenen Meinung nach ist dies ein vollständigeres Beispiel, das auf Gregs basiert:
quelle
Sie können diese "statischen" ähnlichen Klassen haben. aber ich nehme an, dass etwas wirklich Wichtiges fehlt: In PHP haben Sie keinen App-Zyklus, so dass Sie in Ihrer gesamten Anwendung keine echte Statik (oder Singleton) erhalten ...
siehe Singleton in PHP
quelle
Die Struktur von b wird als Singeton-Handler bezeichnet. Sie können dies auch in a tun
Dies ist die Singleton-Verwendung
$a = a::getA(...);
quelle
Im Allgemeinen bevorzuge ich es, reguläre nicht statische Klassen zu schreiben und eine Factory-Klasse zu verwenden, um einzelne (sudostatische) Instanzen des Objekts zu instanziieren.
Auf diese Weise arbeiten Konstruktor und Destruktor wie gewohnt, und ich kann auf Wunsch zusätzliche nicht statische Instanzen erstellen (z. B. eine zweite DB-Verbindung).
Ich verwende dies die ganze Zeit und ist besonders nützlich, um benutzerdefinierte Sitzungshandler für DB-Speicher zu erstellen, da der Destruktor die Sitzung beim Beenden der Seite in die Datenbank überträgt.
Ein weiterer Vorteil ist, dass Sie die Reihenfolge, in der Sie Dinge aufrufen, ignorieren können, da alles bei Bedarf eingerichtet wird.
Die DB-Klasse ...
Überall, wo Sie es verwenden möchten, rufen Sie einfach an ...
Dann behandeln Sie einfach alle Methoden als nicht statisch (weil sie es sind)
quelle
Objekt kann nicht statisch definiert werden, aber das funktioniert
quelle