Maison  >  Article  >  développement back-end  >  Parlons du modèle singleton en PHP

Parlons du modèle singleton en PHP

青灯夜游
青灯夜游avant
2021-07-26 19:05:244007parcourir

Dans l'article précédent "Une analyse approfondie du modèle de méthode modèle en PHP", nous avons présenté le modèle de méthode modèle en PHP. Cet article vous amènera à comprendre le modèle singleton dans les modèles de conception PHP.

Parlons du modèle singleton en PHP

Le modèle singleton est définitivement classé au premier rang parmi les modèles de conception d'entretien couramment utilisés et fréquemment demandés. D’une part, c’est assez simple et peut être expliqué en quelques mots. D'un autre côté, il est assez complexe. Sa mise en œuvre ne se fait pas seulement sous une forme unique, mais nécessite également de prendre en compte la question du verrouillage multithread dans les langages asynchrones tels que Java. Ainsi, pendant l'entretien, ne pensez pas que l'intervieweur se détendra lorsqu'il posera la question sur le modèle singleton. Ce modèle peut vraiment être profond ou superficiel, et il peut extrêmement refléter le niveau d'un développeur. Car tant que vous travaillez pendant un certain temps, vous entrerez inévitablement en contact avec ce modèle.

Diagramme et explication de la classe Gof

Définition GoF : assurez-vous qu'une classe n'a qu'une seule instance et fournissez un point d'accès global pour y accéder.

Diagramme de classe GoF

Parlons du modèle singleton en PHP

Implémentation du code

class Singleton
{
    private static $uniqueInstance;
    private $singletonData = '单例类内部数据';

    private function __construct()
    {
        // 构造方法私有化,外部不能直接实例化这个类
    }

    public static function GetInstance()
    {
        if (self::$uniqueInstance == null) {
            self::$uniqueInstance = new Singleton();
        }
        return self::$uniqueInstance;
    }

    public function SingletonOperation(){
        $this->singletonData = '修改单例类内部数据';
    }

    public function GetSigletonData()
    {
        return $this->singletonData;
    }

}

Oui, le noyau est une telle classe singleton, rien d'autre. Laissez la variable statique se sauvegarder après l'instanciation. Lorsque cet objet est nécessaire, appelez la méthode GetInstance() pour obtenir l'objet globalement unique. En appelant

$singletonA = Singleton::GetInstance();
echo $singletonA->GetSigletonData(), PHP_EOL;

$singletonB = Singleton::GetInstance();

if ($singletonA === $singletonB) {
    echo '相同的对象', PHP_EOL;
}
$singletonA->SingletonOperation(); // 这里修改的是A
echo $singletonB->GetSigletonData(), PHP_EOL;

côté client, nous constaterons que Parlons du modèle singleton en PHPsingletonB est exactement le même objet.

  • Oui, comme vous pouvez le voir dans le code, la plus grande utilisation des singletons est de rendre nos objets globalement uniques.
  • Alors, quels sont les avantages d’être mondial ? La création de certaines classes est très coûteuse et nous n'avons pas besoin d'utiliser de nouveaux objets à chaque fois. Ils peuvent être réutilisés comme un seul objet. Ils n'ont pas de propriétés ou de statut à modifier, mais fournissent uniquement certains services publics. Par exemple, les classes d'opérations de base de données, les classes de requêtes réseau, les classes d'opérations de journalisation, les services de gestion de configuration, etc. Un intervieweur a demandé : un singleton est-il le seul en PHP ? S'il s'agit d'un processus unique, c'est-à-dire d'un fpm, il est bien sûr unique. Ce n’est certainement pas le seul parmi les multiples fpm que nginx extrait simultanément. Un processus par processus !
  • Avantages du modèle singleton : accès contrôlé à des instances uniques ; espace de noms restreint ; permet le raffinement des opérations et la présentation permet un nombre variable d'instances plus flexible que les opérations de classe ;
  • Laravel utilise le modèle singleton dans la partie conteneur IoC. Nous expliquerons la partie conteneur dans les prochains articles de la série Laravel. On retrouve la méthode singleton dans la classe IlluminateContainerContainer. Il appelle la méthode getClosure dans la méthode bind. Si vous continuez à suivre, vous constaterez qu'ils finiront par appeler la méthode make ou build du conteneur pour instancier la classe. Quelle que soit la méthode make ou build, ils auront un jugement singleton, c'est-à-dire pour juger si la classe. a été instancié ou existe déjà dans le conteneur. if (!$reflector->isInstantiable()) dans la construction.
L'entreprise devient de plus en plus grande, mais nous n'avons qu'une seule copie (classe singleton) de toutes les listes d'entreprises, qui est stockée dans notre système OA. Ce que je crains, c'est qu'une confusion surgisse une fois que chaque département aura sa propre liste. Par exemple, si la mise à jour n'est pas effectuée en temps opportun, les employés nouvellement rejoints ou démissionnaires d'autres départements seront manqués. D'autres départements peuvent consulter l'intégralité de la liste en cas de besoin, ou ils peuvent créer et modifier les sections de leur propre département en fonction de l'intégralité de la liste. Mais dans le système OA, ce qu'ils modifient en réalité, c'est le contenu de la liste générale. Ce que tout le monde maintient, c'est en fait la seule véritable liste stockée sur le serveur du système OA

Code complet : https://github.com/zhangyue0503/. designpatterns-php/blob/master/21.singleton/source/singleton.php

Exemple

Depuis que je l'ai dit ci-dessus, j'aime à la fois la classe d'opération de base de données et la classe de requête réseau en utilisant le mode singleton, alors nous le ferons. implémenter le développement du mode singleton de la classe de requête HTTP. Je me souviens que lorsque je travaillais sur Android il y a longtemps, il n'y avait pas autant de frameworks qu'aujourd'hui. Les requêtes HTTP étaient toutes encapsulées par elles-mêmes, et la plupart des tutoriels en ligne adoptaient le mode singleton.

Diagramme des classes de cache

Parlons du modèle singleton en PHP
Code source complet : https://github.com/zhangyue0503/designpatterns-php/blob/master/21.singleton/source/singleton-http.php

<?php 

class HttpService{
    private static $instance;

    public function GetInstance(){
        if(self::$instance == NULL){
            self::$instance = new HttpService();
        }
        return self::$instance;
    }

    public function Post(){
        echo &#39;发送Post请求&#39;, PHP_EOL;
    }

    public function Get(){
        echo &#39;发送Get请求&#39;, PHP_EOL;
    }
}

$httpA = new HttpService();
$httpA->Post();
$httpA->Get();

$httpB = new HttpService();
$httpB->Post();
$httpB->Get();

var_dump($httpA == $httpB);

Instructions

  • Est-ce encore très simple ? Je ne parlerai pas davantage de cette forme de singleton ici. Parlons de plusieurs autres formes de singletons
  • Dans les langages statiques comme Java, les variables statiques peuvent être directement de nouveaux objets, dans la déclaration Parlons du modèle singleton en PHP

    instance = new HttpService();. De cette façon, la méthode GetInstance() peut être omise, mais cette variable statique sera directement instanciée et occupera de la mémoire qu'elle soit utilisée ou non. Ce type de singleton est appelé le modèle singleton chinois affamé.

  • Notre code et nos exemples ne sont évidemment pas du style Hungry Man, ce formulaire est appelé style Lazy Man. Vous devez utiliser activement GetInstance() pour l'obtenir, puis je créerai l'objet.
  • Dans les applications multithread, telles que le multi-threading Java ou l'utilisation de swoole en PHP, le problème de la création répétée se produira et les objets créés plusieurs fois ne sont pas le même objet. À l’heure actuelle, la double détection est généralement utilisée pour garantir qu’il n’existe qu’un seul objet global. Vous pouvez trouver le code spécifique vous-même. Il n'y aura aucun problème avec le style Hungry Han. Le style Hungry Han lui-même a déjà attribué une valeur à l'attribut statique et ne changera plus.
  • Une autre façon consiste à créer des classes internes statiques. Cela est rarement observé et son taux d’utilisation des ressources est élevé. Placez la variable statique à l'intérieur de la méthode afin qu'elle devienne une variable dans la méthode au lieu d'une variable dans la classe. Il permet à un objet singleton d'appeler ses propres méthodes et propriétés statiques.

Adresse originale : https://juejin.cn/post/6844903990585458702

Auteur : Hardcore Project Manager

Apprentissage recommandé : "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer