Statique de la classe d'initialiseur en PHP
J'ai une classe helper avec certaines fonctions statiques. Toutes les fonctions de la classe d'exiger un "lourd" initialisation de la fonction à exécuter une seule fois (comme si c'était un constructeur).
Est-il une bonne pratique pour atteindre cet objectif?
La seule chose que j'ai pensé a l'appel d'une init
fonction, et de briser son flux, si elle a déjà exécuté une seule fois (à l'aide d'un statique $initialized
var). Le problème est que j'ai besoin de l'appeler dans la classe de fonctions.
- En vertu de discussion est le Static Constructeur de la Classe RFC, qui offre une approche alternative.
- Les futurs lecteurs: Voici le code de détails et une analyse de l'approche user258626 a dit qu'il était la pensée de faire. Veuillez comparer à la accepté de répondre. Décider laquelle vous préférez avoir. Ou utilisez l'une des autres réponses, je suggère que vous pas adopter aveuglément accepté de répondre. Point clé: Comme un principe général, il est préférable de payer le codage prix une fois, lorsque l'on code une classe, pour garder les appelants plus simple.
Vous devez vous connecter pour publier un commentaire.
Semble que vous seriez mieux servi par un singleton plutôt que d'un tas de méthodes statiques
Et puis, dans l'utilisation de la
getInstance()
... Vous allez faire, il est TRÈS difficile de tester efficacement... À moins protégés de façon à ce que vous avez des options...static::$instance
au lieu deself::$instance
?new static()
au lieu denew self()
(de cette façon, vous pouvez remplacer la classe)getInstance
renvoie une instance. C'est sur cette instance, que les méthodes d'instance sont appelés. [Voirself::$instance = new self();
pour l'instance.] Otoh, que, autant que je me souvienne, est dans le cas queself::$instance
génère maintenant un avertissement, et doit être remplacé parSingleton::$instance
. Mais c'est une autre question.De cette façon, l'initialisation se produit lorsque le fichier de classe est inclus. Vous pouvez vous assurer que cela se produit uniquement lorsque c'est nécessaire (et une seule fois) à l'aide d'auto-chargement.
init
une méthode publique, et que ça ne marcherait pas si c'est privé. N'est-il pas le moyen le plus propre comme le java statique de la classe d'initialiseur?static function init() { if(self::$inited) return; /* ... */ }
Foo::init();
ligne en quelque sorte ne sont pas ramassés pour la couverture de code à l'aide dephpunit.phar --coverage-html
En fait, j'utilise une méthode statique publique
__init__()
sur mes classes statiques qui nécessitent d'initialisation (ou au moins de les exécuter du code). Alors, dans mon autochargeur, lors du chargement d'une classe, il vérifieis_callable($class, '__init__')
. Si elle l'est, il appelle cette méthode. Rapide, simple et efficace...__initStatic()
. Il se sent comme une chose PHP besoins, sachant Java.REMARQUE: c'est exactement Ce que l'OP a dit qu'ils ont fait. (Mais à ne pas montrer du code.) Je montre ici dans les détails, de sorte que vous pouvez comparer à la accepté de répondre. Mon point est que l'OP d'origine de l'instinct était, à mon humble avis, mieux que la réponse qu'il a accepté.
Compte tenu de la façon très upvoted la accepté de répondre, je tiens à souligner le "naïf" réponse à un temps d'initialisation de méthodes statiques, est à peine plus que le code que la mise en œuvre de Singleton -- et a un avantage essentiel.
L'avantage de cette approche, est que vous obtenez de l'appel avec la simplicité de la statique de la syntaxe de la fonction:
De contraste pour les appels requis par le a accepté de répondre:
Comme un principe général, il est préférable de payer le codage prix une fois, lorsque l'on code une classe, pour garder les appelants plus simple.
De toutes les réponses (y compris celui-ci), je préfère Victor Nicollet réponse. Simple. Pas de codage supplémentaire requis. Pas de "avancé" codage à comprendre. (Je vous conseille notamment FrancescoMM de commenter, assurez-vous que "init" ne s'exécutera jamais deux fois.)
Si je pouvais avoir pas pris la peine d'écrire cette réponse. Mais beaucoup de gens upvoted la accepté de répondre, que je en conclure que certaines personnes ne sont tout simplement pas conscients de ce qui est évident, "naïf", approche (que je montre ici). Comprendre ceci comme un point de départ.
init()
quand elle est fausse, sinon utiliser la valeur de la propriété.Il y a un moyen d'appeler la
init()
méthode une fois et interdire son utilisation, vous pouvez activer la fonction dans le secteur privé de l'initialiseur et ivoke après la déclaration de la classe comme ceci:private init
de l'extérieur de la classe? Pouvez-vous expliquer les détails de ce que vous faites ici?Example::class
de sorte qu'il est possible d'appeler une méthode privée. J'ai un bug à cause de lainit()
méthode doit êtrestatic
- correction de l'exemple.static
modificateur de fermeture de cause, il ne sera pas lié à une quelconque instance.Si vous n'aimez pas
public
initialiseur statique, la réflexion peut être une solution de contournement.Remarque - la RFC cette proposition est encore à l'état de brouillon.
proposé pour PHP 7.x (voir https://wiki.php.net/rfc/static_class_constructor )