Mam ten kod:
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
);
Co daje mi następujący błąd:
Błąd analizy: błąd składni, nieoczekiwany „(”, oczekiwanie „)” w /home/user/Sites/site/registration/inc/registration.class.inc w linii 19
Więc chyba coś robię źle ... ale jak mogę to zrobić, jeśli nie tak? Jeśli zmienię mktime na zwykłe ciągi, to działa. Wiem, że mogę to zrobić w ten sposób ...
Czy ktoś ma jakieś wskazówki?
php
class
static-members
Svish
źródło
źródło
Odpowiedzi:
PHP nie może analizować nietrywialnych wyrażeń w inicjalizatorach.
Wolę obejść ten problem, dodając kod zaraz po definicji klasy:
lub
PHP 5.6 obsługuje teraz niektóre wyrażenia.
źródło
init
upublicznienia, co jest brzydkie. Jakie jest lepsze rozwiązanie?class Foo {public static $bar = array(3 * 4, "b" => 7 + 8);} var_dump(Foo::$bar);
Jeśli masz kontrolę nad ładowaniem klas, możesz stamtąd dokonać inicjalizacji statycznej.
Przykład:
w module ładującym klasy wykonaj następujące czynności:
Bardziej ciężkim rozwiązaniem byłoby użycie interfejsu z ReflectionClass:
w module ładującym klasy wykonaj następujące czynności:
źródło
Zamiast znaleźć sposób na działanie zmiennych statycznych, wolę po prostu utworzyć funkcję gettera. Przydaje się również, jeśli potrzebujesz tablic należących do określonej klasy i jest o wiele prostszy w implementacji.
Gdziekolwiek potrzebujesz listy, po prostu wywołaj metodę gettera. Na przykład:
źródło
Używam kombinacji odpowiedzi Tjeerda Vissera i porneL.
Ale jeszcze lepszym rozwiązaniem jest wyeliminowanie metod statycznych i użycie wzorca Singleton. Następnie wykonujesz skomplikowaną inicjalizację w konstruktorze. Lub uczyń go „usługą” i użyj DI, aby wstrzyknąć go do dowolnej klasy, która tego potrzebuje.
źródło
To zbyt skomplikowane, aby można je było zdefiniować w definicji. Możesz jednak ustawić definicję na null, a następnie w konstruktorze sprawdź ją, a jeśli nie została zmieniona - ustaw:
źródło
W tej części kodu nie można wykonywać wywołań funkcji. Jeśli stworzysz metodę typu init (), która zostanie wykonana przed wykonaniem jakiegokolwiek innego kodu, wówczas będziesz mógł wypełnić zmienną.
źródło
W PHP 7.0.1 mogłem to zdefiniować:
A następnie użyj tego w ten sposób:
źródło
najlepszym sposobem jest utworzenie takiego akcesorium:
wtedy możesz zrobić static :: db (); lub self :: db (); skądkolwiek.
źródło
Oto, mam nadzieję, pomocny wskaźnik, w przykładzie kodu. Zwróć uwagę, jak funkcja inicjalizacyjna jest wywoływana tylko raz.
Ponadto, jeśli odwrócisz połączenia
StaticClass::initializeStStateArr()
i$st = new StaticClass()
uzyskasz ten sam wynik.Co daje:
źródło
static { /* some code accessing static members*/ }