Ich habe diesen Code:
private static $dates = array(
'start' => mktime( 0, 0, 0, 7, 30, 2009), // Start date
'end' => mktime( 0, 0, 0, 8, 2, 2009), // End date
'close' => mktime(23, 59, 59, 7, 20, 2009), // Date when registration closes
'early' => mktime( 0, 0, 0, 3, 19, 2009), // Date when early bird discount ends
);
Was mir folgenden Fehler gibt:
Analysefehler: Syntaxfehler, unerwartetes '(', Erwarten ')' in /home/user/Sites/site/registration/inc/registration.class.inc in Zeile 19
Also, ich denke ich mache etwas falsch ... aber wie kann ich das machen, wenn nicht so? Wenn ich das Mktime-Zeug mit regulären Strings ändere, funktioniert es. Also ich weiß , dass ich es tun kann irgendwie ähnlich ..
Hat jemand ein paar Hinweise?
php
class
static-members
Svish
quelle
quelle
Antworten:
PHP kann nicht triviale Ausdrücke in Initialisierern nicht analysieren.
Ich ziehe es vor, dies zu umgehen, indem ich Code direkt nach der Definition der Klasse hinzufüge:
oder
PHP 5.6 kann jetzt einige Ausdrücke verarbeiten.
quelle
init
öffentlich zu machen, was hässlich ist. Was ist eine bessere Lösung?class Foo {public static $bar = array(3 * 4, "b" => 7 + 8);} var_dump(Foo::$bar);
Wenn Sie die Kontrolle über das Laden von Klassen haben, können Sie von dort aus eine statische Initialisierung durchführen.
Beispiel:
Gehen Sie in Ihrem Klassenlader wie folgt vor:
Eine schwerere Lösung wäre die Verwendung einer Schnittstelle mit ReflectionClass:
Gehen Sie in Ihrem Klassenlader wie folgt vor:
quelle
Anstatt einen Weg zu finden, um statische Variablen zum Laufen zu bringen, ziehe ich es vor, einfach eine Getter-Funktion zu erstellen. Auch hilfreich, wenn Sie Arrays benötigen, die zu einer bestimmten Klasse gehören und viel einfacher zu implementieren sind.
Wo immer Sie die Liste benötigen, rufen Sie einfach die Getter-Methode auf. Beispielsweise:
quelle
Ich benutze eine Kombination aus der Antwort von Tjeerd Visser und porneL.
Eine noch bessere Lösung besteht darin, die statischen Methoden abzuschaffen und das Singleton-Muster zu verwenden. Dann führen Sie einfach die komplizierte Initialisierung im Konstruktor durch. Oder machen Sie es zu einem "Service" und verwenden Sie DI, um es in eine Klasse zu injizieren, die es benötigt.
quelle
Das ist zu komplex, um es in der Definition festzulegen. Sie können die Definition jedoch auf null setzen und sie dann im Konstruktor überprüfen. Wenn sie nicht geändert wurde, setzen Sie sie:
quelle
In diesem Teil des Codes können keine Funktionsaufrufe durchgeführt werden. Wenn Sie eine Methode vom Typ init () erstellen, die vor jedem anderen Code ausgeführt wird, können Sie die Variable dann füllen.
quelle
In PHP 7.0.1 konnte ich Folgendes definieren:
Und dann benutze es so:
quelle
Der beste Weg ist, einen Accessor wie folgt zu erstellen:
dann kannst du static :: db () machen; oder self :: db (); von überall.
quelle
Hier ist ein hoffentlich hilfreicher Zeiger in einem Codebeispiel. Beachten Sie, dass die Initialisierungsfunktion nur einmal aufgerufen wird.
Auch, wenn Sie invertieren die Anrufe an
StaticClass::initializeStStateArr()
und$st = new StaticClass()
Sie erhalten das gleiche Ergebnis.Welche Ausbeuten:
quelle
static { /* some code accessing static members*/ }