Comment créer une classe Singleton en utilisant des classes PHP5?
php
oop
design-patterns
singleton
Andrew Moore
la source
la source
Réponses:
Utiliser:
$fact == $fact2;
Mais:
Lance une erreur.
Voir http://php.net/manual/en/language.variables.scope.php#language.variables.scope.static pour comprendre les portées des variables statiques et pourquoi le réglage
static $inst = null;
fonctionne.la source
PHP 5.3 permet la création d'une classe Singleton héritable via une liaison statique tardive:
Cela résout le problème qu'avant PHP 5.3, toute classe qui étendait un Singleton produirait une instance de sa classe parente au lieu de la sienne.
Vous pouvez maintenant:
Et $ foo sera une instance de Foobar au lieu d'une instance de Singleton.
la source
"subclass should own its own static var. check this: echo get_class(Foobar::getInstance());echo get_class(Singleton::getInstance());"
.$instance
réside à Singleton, pas la sous-classe. Après l'instanciation d'une sous-classe, getInstance () renverra cette instance pour toutes les sous-classes.Malheureusement, la réponse d'Inwdr se casse lorsqu'il y a plusieurs sous-classes.
Voici une classe de base Singleton héritable correcte.
Code de test:
la source
La façon réelle et moderne de créer un motif Singleton est la suivante:
Alors maintenant, vous pouvez l'utiliser comme.
Comme vous le voyez, cette réalisation est beaucoup plus flexible.
la source
instance
fonction$instance
ne devraitnull
pas êtrefalse
Vous devriez probablement ajouter une méthode privée __clone () pour interdire le clonage d'une instance.
Si vous n'incluez pas cette méthode, ce qui suit devient possible
maintenant
$inst1
! ==$inst2
- ce ne sont plus la même instance.la source
utiliser:
réponse:
Si vous utilisez PHP 5.4: trait c'est une option, vous n'avez donc pas à gaspiller la hiérarchie d'héritage pour avoir le modèle Singleton
et notez également que si vous utilisez des traits ou étend la classe Singleton une extrémité libre était de créer un singleton de classes enfants si vous n'ajoutez pas la ligne de code suivante:
en classe enfant
le résultat inattendu sera:
la source
Ce code peut s'appliquer à n'importe quelle classe sans se soucier de son nom de classe.
la source
Prend en charge plusieurs objets avec 1 ligne par classe:
Cette méthode imposera des singletons sur n'importe quelle classe que vous souhaitez, tout ce que vous devez faire est d'ajouter 1 méthode à la classe que vous souhaitez faire un singleton et cela le fera pour vous.
Cela stocke également les objets dans une classe "SingleTonBase" afin que vous puissiez déboguer tous vos objets que vous avez utilisés dans votre système en recursant les
SingleTonBase
objets.Créez un fichier appelé SingletonBase.php et incluez-le à la racine de votre script!
Le code est
Ensuite, pour n'importe quelle classe que vous souhaitez créer un singleton, ajoutez simplement cette petite méthode unique.
Voici un petit exemple:
Et vous pouvez simplement ajouter cette fonction singleton dans n'importe quelle classe que vous avez et elle ne créera qu'une seule instance par classe.
REMARQUE: vous devez toujours rendre le __construct privé pour éliminer l'utilisation de new Class (); instanciations.
la source
la source
Vous n'avez pas vraiment besoin d'utiliser le modèle Singleton car il est considéré comme un contre-modèle. Fondamentalement, il existe de nombreuses raisons de ne pas du tout mettre en œuvre ce modèle. Lisez ceci pour commencer: Meilleures pratiques sur les classes PHP singleton .
Si après tout vous pensez toujours que vous devez utiliser le modèle Singleton, nous pourrions écrire une classe qui nous permettra d'obtenir la fonctionnalité Singleton en étendant notre classe abstraite SingletonClassVendor.
C'est ce que je suis venu pour résoudre ce problème.
Exemple d'utilisation:
Juste pour prouver que cela fonctionne comme prévu:
la source
Toute cette complexité ("liaison statique tardive" ... harumph) est, pour moi, simplement un signe du modèle objet / classe cassé de PHP. Si les objets de classe étaient des objets de première classe (voir Python), alors "$ _instance" serait une instance de classe variable d' - un membre de l'objet de classe, par opposition à un membre / propriété de ses instances, et également par opposition à partagé par ses descendants. Dans le monde Smalltalk, c'est la différence entre une "variable de classe" et une "variable d'instance de classe".
En PHP, il me semble que nous devons prendre à cœur les indications selon lesquelles les modèles sont un guide pour écrire du code - nous pourrions peut-être penser à un modèle Singleton, mais essayer d'écrire du code qui hérite d'une classe "Singleton" réelle semble mal orienté pour PHP (même si je supposais qu'une âme entreprenante pourrait créer un mot clé SVN approprié).
Je vais continuer à coder chaque singleton séparément, en utilisant un modèle partagé.
Remarquez que je reste absolument HORS de la discussion singletons-are-evil, la vie est trop courte.
la source
Je sais que cela va probablement provoquer une guerre des flammes inutile, mais je peux voir comment vous pourriez vouloir plus d'une connexion à la base de données, donc je concéderais que singleton pourrait ne pas être la meilleure solution pour cela ... cependant, il y a d'autres utilisations du motif singleton que je trouve extrêmement utiles.
Voici un exemple: j'ai décidé de lancer mon propre MVC et moteur de template parce que je voulais quelque chose de vraiment léger. Cependant, les données que je veux afficher contiennent beaucoup de caractères mathématiques spéciaux tels que ≥ et μ et qu'avez-vous ... Les données sont stockées en tant que caractère UTF-8 réel dans ma base de données plutôt que pré-HTML car mon application peut fournir d'autres formats tels que PDF et CSV en plus du HTML. L'endroit approprié pour formater le code HTML est à l'intérieur du modèle ("afficher" si vous voulez) qui est responsable du rendu de cette section de la page (extrait). Je veux les convertir en leurs entités HTML appropriées, mais la fonction get_html_translation_table () des PHP n'est pas super rapide. Il est plus judicieux de récupérer les données une fois et de les stocker sous forme de tableau, ce qui les rend accessibles à tous. Ici' Dans un échantillon, j'ai frappé ensemble pour tester la vitesse. Vraisemblablement, cela fonctionnerait indépendamment du fait que les autres méthodes que vous utilisez (après avoir obtenu l'instance) soient statiques ou non.
Fondamentalement, j'ai vu des résultats typiques comme celui-ci:
Donc, même si je ne suis certainement pas un expert, je ne vois pas de moyen plus pratique et fiable de réduire la surcharge des appels lents pour une sorte de données, tout en le rendant super simple (une seule ligne de code pour faire ce dont vous avez besoin). Certes, mon exemple n'a qu'une seule méthode utile, et n'est donc pas mieux qu'une fonction définie globalement, mais dès que vous avez deux méthodes, vous allez vouloir les regrouper, non? Suis-je loin de la base?
De plus, je préfère les exemples qui font réellement quelque chose, car il est parfois difficile de visualiser quand un exemple comprend des instructions comme "// faire quelque chose d'utile ici" que je vois tout le temps lors de la recherche de tutoriels.
Quoi qu'il en soit, j'aimerais avoir des commentaires ou des commentaires sur les raisons pour lesquelles l'utilisation d'un singleton pour ce type de chose est préjudiciable (ou trop compliquée).
la source
Cet article couvre un sujet assez largement: http://www.phptherightway.com/pages/Design-Patterns.html#singleton
la source
J'ai écrit depuis longtemps pensé à partager ici
la source
Je suis d'accord avec la première réponse mais je déclarerais également la classe comme finale afin qu'elle ne puisse pas être étendue car l'extension d'un singleton viole le modèle singleton. La variable d'instance doit également être privée afin de ne pas être accessible directement. Rendez également la méthode __clone privée afin que vous ne puissiez pas cloner l'objet singleton.
Voici un exemple de code.
Exemple d'utilisation
Ce que cela vous empêche de faire (ce qui violerait le modèle singleton ..
TU NE PEUX PAS FAIRE ÇA!
la source
Cela devrait être la bonne façon de Singleton.
la source
J'ai aimé la méthode @ jose-segura d'utiliser des traits mais je n'ai pas aimé la nécessité de définir une variable statique sur les sous-classes. Voici une solution qui l'évite en mettant en cache les instances d'une variable locale statique dans la méthode d'usine indexée par nom de classe:
L'utilisation est la même que @ jose-segura mais pas besoin de la variable statique dans les sous-classes.
la source
Classe de base de données qui vérifie s'il existe une instance de base de données existante, elle retournera l'instance précédente.
Réf http://www.phptechi.com/php-singleton-design-patterns-example.html
la source
Ceci est l'exemple de création de singleton sur la classe Database
motifs de conception 1) singleton
alors mis est -
utiliser une seule instance et non pas créer 3 instances
la source
Exemple rapide:
J'espère de l'aide.
la source
Voici mon exemple qui offre la possibilité d'appeler en tant que $ var = new Singleton () et de créer également 3 variables pour tester s'il crée un nouvel objet:
la source