У меня есть этот код:
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
);
Что дает мне следующую ошибку:
Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный '(', ожидающий ')' в /home/user/Sites/site/registration/inc/registration.class.inc строке 19
Итак, я думаю, что я делаю что-то не так ... но как я могу это сделать, если не так? Если я изменю mktime с помощью обычных строк, это сработает. Так что я знаю, что могу сделать что- то вроде этого ..
У кого-нибудь есть указатели?
php
class
static-members
Svish
источник
источник
Ответы:
PHP не может анализировать нетривиальные выражения в инициализаторах.
Я предпочитаю обходить это путем добавления кода сразу после определения класса:
или
PHP 5.6 теперь может обрабатывать некоторые выражения.
источник
init
обнародовать, что уродливо. Какое решение лучше?class Foo {public static $bar = array(3 * 4, "b" => 7 + 8);} var_dump(Foo::$bar);
Если у вас есть контроль над загрузкой классов, вы можете выполнить статическую инициализацию оттуда.
Пример:
в вашем загрузчике классов сделайте следующее:
Более тяжелым решением будет использование интерфейса с ReflectionClass:
в вашем загрузчике классов сделайте следующее:
источник
Вместо того, чтобы найти способ заставить работать статические переменные, я предпочитаю просто создать функцию получения. Также полезно, если вам нужны массивы, принадлежащие определенному классу, и намного проще в реализации.
Везде, где вам нужен список, просто вызовите метод получения. Например:
источник
Я использую комбинацию ответа Tjeerd Visser и porneL.
Но еще лучшее решение - избавиться от статических методов и использовать шаблон Singleton. Затем вы просто делаете сложную инициализацию в конструкторе. Или сделайте его «сервисом» и используйте DI, чтобы внедрить его в любой класс, который в этом нуждается.
источник
Это слишком сложно, чтобы установить в определении. Вы можете установить определение в null, а затем в конструкторе проверить его, и если оно не было изменено - установите его:
источник
Вы не можете выполнять вызовы функций в этой части кода. Если вы создадите метод типа init (), который будет выполнен раньше, чем любой другой код, тогда вы сможете заполнить переменную.
источник
В PHP 7.0.1 я смог определить это:
И затем используйте это так:
источник
Лучший способ - создать такой метод доступа:
тогда вы можете сделать static :: db (); или self :: db (); откуда угодно.
источник
Вот, надеюсь, полезный указатель в примере кода. Обратите внимание, как функция инициализатора вызывается только один раз.
Кроме того, если вы перевернете вызовы,
StaticClass::initializeStStateArr()
и$st = new StaticClass()
вы получите тот же результат.Что дает :
источник
static { /* some code accessing static members*/ }