Tengo este codigo:
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
);
Lo que me da el siguiente error:
Error de análisis: error de sintaxis, inesperado '(', esperando ')' en /home/user/Sites/site/registration/inc/registration.class.inc en la línea 19
Entonces, supongo que estoy haciendo algo mal ... pero ¿cómo puedo hacer esto si no es así? Si cambio las cosas de mktime con cadenas regulares, funciona. Entonces sé que puedo hacerlo de esa manera ...
Alguien tiene algunos consejos?
php
class
static-members
Svish
fuente
fuente
Respuestas:
PHP no puede analizar expresiones no triviales en inicializadores.
Prefiero evitar esto agregando código justo después de la definición de la clase:
o
PHP 5.6 puede manejar algunas expresiones ahora.
fuente
init
público lo que es feo. ¿Qué es una mejor solución?class Foo {public static $bar = array(3 * 4, "b" => 7 + 8);} var_dump(Foo::$bar);
Si tiene control sobre la carga de clases, puede hacer una inicialización estática desde allí.
Ejemplo:
en su cargador de clases, haga lo siguiente:
Una solución más pesada sería utilizar una interfaz con ReflectionClass:
en su cargador de clases, haga lo siguiente:
fuente
En lugar de encontrar una manera de hacer que funcionen las variables estáticas, prefiero simplemente crear una función getter. También es útil si necesita matrices que pertenecen a una clase específica y mucho más simple de implementar.
Donde sea que necesite la lista, simplemente llame al método getter. Por ejemplo:
fuente
Utilizo una combinación de la respuesta de Tjeerd Visser y de porneL.
Pero una solución aún mejor es eliminar los métodos estáticos y usar el patrón Singleton. Entonces solo haces la complicada inicialización en el constructor. O conviértalo en un "servicio" y use DI para inyectarlo en cualquier clase que lo necesite.
fuente
Eso es demasiado complejo para establecerlo en la definición. Sin embargo, puede establecer la definición como nula, y luego en el constructor, verificarla y, si no se ha cambiado, configúrela:
fuente
No puede realizar llamadas a funciones en esta parte del código. Si crea un método de tipo init () que se ejecuta antes que cualquier otro código, entonces podrá completar la variable.
fuente
En PHP 7.0.1, pude definir esto:
Y luego úsalo así:
fuente
La mejor manera es crear un descriptor de acceso como este:
entonces puedes hacer static :: db (); o self :: db (); de donde sea.
fuente
Aquí hay un puntero con suerte útil, en un ejemplo de código. Observe cómo la función de inicializador solo se llama una vez.
Además, si invierte las llamadas
StaticClass::initializeStStateArr()
y$st = new StaticClass()
obtendrá el mismo resultado.Cuyos rendimientos :
fuente
static { /* some code accessing static members*/ }