Eu tenho este código:
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
);
O que me dá o seguinte erro:
Erro de análise: erro de sintaxe, inesperado '(', expecting ')' em /home/user/Sites/site/registration/inc/registration.class.inc na linha 19
Então, acho que estou fazendo algo errado ... mas como posso fazer isso se não for assim? Se eu mudar o material do mktime com seqüências regulares, ele funcionará. Então, eu sei que posso fazê-lo tipo de como isso ..
Alguém tem algumas dicas?
php
class
static-members
Svish
fonte
fonte
Respostas:
O PHP não pode analisar expressões não triviais nos inicializadores.
Prefiro contornar isso adicionando código logo após a definição da classe:
ou
O PHP 5.6 pode lidar com algumas expressões agora.
fonte
init
público o que é feio. Qual a melhor solução?class Foo {public static $bar = array(3 * 4, "b" => 7 + 8);} var_dump(Foo::$bar);
Se você tiver controle sobre o carregamento de classe, poderá fazer a inicialização estática a partir daí.
Exemplo:
no seu carregador de classes, faça o seguinte:
Uma solução mais pesada seria usar uma interface com o ReflectionClass:
no seu carregador de classes, faça o seguinte:
fonte
Em vez de encontrar uma maneira de fazer funcionar as variáveis estáticas, prefiro simplesmente criar uma função getter. Também é útil se você precisar de matrizes pertencentes a uma classe específica e muito mais simples de implementar.
Onde quer que você precise da lista, basta chamar o método getter. Por exemplo:
fonte
Uso uma combinação da resposta de Tjeerd Visser e de PorneL.
Mas uma solução ainda melhor é acabar com os métodos estáticos e usar o padrão Singleton. Então você apenas faz a inicialização complicada no construtor. Ou torne-o um "serviço" e use o DI para injetá-lo em qualquer classe que precise dele.
fonte
Isso é muito complexo para definir na definição. Você pode definir a definição como nula e, no construtor, verifique-a e, se não tiver sido alterada - defina-a:
fonte
Você não pode fazer chamadas de função nesta parte do código. Se você criar um método do tipo init () executado antes de qualquer outro código, poderá preencher a variável.
fonte
No PHP 7.0.1, eu consegui definir isso:
E então use-o assim:
fonte
A melhor maneira é criar um acessador como este:
então você pode fazer static :: db (); ou self :: db (); de qualquer lugar.
fonte
Aqui está um ponteiro esperançosamente útil, em um exemplo de código. Observe como a função inicializadora é chamada apenas uma vez.
Além disso, se você inverter as chamadas
StaticClass::initializeStStateArr()
e$st = new StaticClass()
obter o mesmo resultado.Qual produz:
fonte
static { /* some code accessing static members*/ }