J'ai ce 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
);
Ce qui me donne l'erreur suivante:
Erreur d'analyse: erreur de syntaxe, inattendu '(', expecting ')' dans /home/user/Sites/site/registration/inc/registration.class.inc sur la ligne 19
Donc, je suppose que je fais quelque chose de mal ... mais comment puis-je faire ceci si ce n'est pas comme ça? Si je change le truc mktime avec des cordes régulières, ça marche. Donc je sais que je peux le faire un peu comme ça ..
Quelqu'un a des conseils?
php
class
static-members
Svish
la source
la source
Réponses:
PHP ne peut pas analyser les expressions non triviales dans les initialiseurs.
Je préfère contourner cela en ajoutant du code juste après la définition de la classe:
ou
PHP 5.6 peut désormais gérer certaines expressions.
la source
init
public ce qui est moche. Quelle meilleure solution?class Foo {public static $bar = array(3 * 4, "b" => 7 + 8);} var_dump(Foo::$bar);
Si vous contrôlez le chargement des classes, vous pouvez effectuer une initialisation statique à partir de là.
Exemple:
dans votre chargeur de classe, procédez comme suit:
Une solution plus lourde serait d'utiliser une interface avec ReflectionClass:
dans votre chargeur de classe, procédez comme suit:
la source
Au lieu de trouver un moyen de faire fonctionner les variables statiques, je préfère simplement créer une fonction getter. Aussi utile si vous avez besoin de tableaux appartenant à une classe spécifique et beaucoup plus simples à implémenter.
Partout où vous avez besoin de la liste, appelez simplement la méthode getter. Par exemple:
la source
J'utilise une combinaison de la réponse de Tjeerd Visser et de porneL.
Mais une solution encore meilleure consiste à supprimer les méthodes statiques et à utiliser le modèle Singleton. Ensuite, vous venez de faire l'initialisation compliquée dans le constructeur. Ou faites-en un "service" et utilisez DI pour l'injecter dans n'importe quelle classe qui en a besoin.
la source
C'est trop complexe pour être défini dans la définition. Vous pouvez cependant définir la définition sur null, puis dans le constructeur, vérifiez-la, et si elle n'a pas été modifiée - définissez-la:
la source
Vous ne pouvez pas effectuer d'appels de fonction dans cette partie du code. Si vous créez une méthode de type init () qui est exécutée avant tout autre code, vous pourrez alors remplir la variable.
la source
En PHP 7.0.1, j'ai pu définir ceci:
Et puis utilisez-le comme ceci:
la source
la meilleure façon est de créer un accesseur comme celui-ci:
alors vous pouvez faire static :: db (); ou self :: db (); de partout.
la source
Voici un pointeur, espérons-le, utile, dans un exemple de code. Notez que la fonction d'initialisation n'est appelée qu'une seule fois.
De plus, si vous inversez les appels vers
StaticClass::initializeStStateArr()
et$st = new StaticClass()
vous obtiendrez le même résultat.Ce qui donne:
la source
static { /* some code accessing static members*/ }