web-dev-qa-db-fra.com

Meilleures pratiques sur PHP classes singleton

Duplicata possible:
Qui a besoin de singletons?

J'écris toujours par rapport à meilleure pratique, mais je veux aussi comprendre pourquoi une chose donnée est une meilleure pratique.

J'ai lu dans un article (je ne me souviens malheureusement pas) que les classes singleton sont préférables pour être instanciées, plutôt que d'être créées avec des fonctions statiques et accessibles avec l'opérateur de résolution de portée (: :). Donc, si j'ai une classe qui contient tous mes outils à valider, en bref:

class validate {
    private function __construct(){}
    public static function email($input){
        return true;
    }
}

On m'a dit que cela est considéré mauvaise pratique (ou du moins mis en garde contre), à ​​cause de choses telles que le ramasse-miettes et la maintenance. Donc, ce que veulent les critiques de la "classe singleton en tant que méthodes statiques", c'est que j'instancie une classe, je suis certain à 100% que je ne l'instancierai qu'une seule fois. Pour moi, cela ressemble à un "double travail", car tout est prêt là-bas. Qu'est-ce que je rate?

Quelle est votre opinion à ce sujet? Bien sûr, ce n'est pas un problème de vie ou de mort, mais on pourrait aussi bien faire les choses dans le bon sens, si l'option est là :)

23
51
ThinkingMonkey

Un objet singleton est un objet qui n'est instancié qu'une seule fois. Ce n'est pas la même chose que le Singleton Pattern , qui est un (Anti-) Pattern comment écrire une classe qui ne peut être instancié qu'une seule fois, le Singleton (large [~ # ~] s [~ # ~] au début):

"Assurez-vous qu'une classe n'a qu'une seule instance et fournissez un point d'accès global à celle-ci."

En ce qui concerne PHP est concerné, vous n'avez normalement pas besoin d'implémenter le modèle Singleton. En fait, vous devriez éviter de le faire lorsque vous demandez les meilleures pratiques , car c'est une mauvaise pratique .

De plus, la plupart des exemples de code PHP que vous trouvez sont des implémentations à moitié prêtes du modèle qui négligent le fonctionnement de PHP. Ces implémentations bidon ne sont pas conformes à la "dans le motif.

Cela dit aussi quelque chose: Souvent, ce n'est pas nécessaire. Si une implémentation bâclée fait déjà le travail sans même s'approcher du modèle, le mauvais modèle a été utilisé pour la situation, il commence à devenir un anti-modèle .

Dans PHP il n'est normalement pas nécessaire de s'assurer à tout prix qu'une classe n'a qu'une seule instance, PHP ne sont pas aussi complexes que vous en auriez besoin ( par exemple, il n'y a pas de plusieurs threads qui pourraient avoir besoin de se référer à une instance atomique).

Ce qui reste souvent, c'est le point d'accès global à l'instance de classe, qui est pour ce que la plupart des développeurs PHP utilisent (incorrectement) le modèle. Comme on le sait aujourd'hui, en utilisant de tels "Singletons "conduisent aux problèmes standard d'état statique global qui introduisent de la complexité dans votre code à plusieurs niveaux et diminuent la réutilisation. En tant que programmeur, vous perdez la possibilité d'utiliser votre code de manière flexible. Mais la flexibilité est une technique très importante à résoudre Et les programmeurs résolvent les problèmes toute la journée.

Donc, avant d'appliquer un motif de conception , les avantages et les inconvénients doivent être évalués. L'utilisation d'un modèle le plus souvent n'est pas utile.

Pour commencer, je dirais, écrivez simplement vos classes et faites attention comment et quand elles sont instanciées dans une autre partie de votre logique d'application afin que les choses restent flexibles.

6
hakre

Eh bien, ce n'est pas vraiment un singleton; un singleton garantit que vous n'avez qu'une seule instance d'une classe, et il n'y a aucune méthode ici qui pourrait récupérer une seule instance de Validate. Votre conception semble ici être une classe statique. Cela ne causera pas de problème avec le garbage collector (au moins le code que vous avez placé ici), car il serait chargé en mémoire quoi qu'il arrive.

2
Steve Rukuts