Maison  >  Article  >  développement back-end  >  [Design Pattern] Scénarios d'application et implémentation du modèle PHP singleton

[Design Pattern] Scénarios d'application et implémentation du modèle PHP singleton

大鹏
大鹏original
2020-06-02 00:58:483408parcourir

Résumé

Qu'est-ce que le modèle singleton ?

Une classe n'est autorisée à créer qu'un seul objet (ou instance), alors cette classe est une classe singleton. Ce modèle de conception est appelé le modèle de conception singleton, ou modèle singleton en abrégé.

Pourquoi utiliser singleton ?

  1. Gérer les conflits d'accès aux ressources.

    Par exemple : la fonction d'impression des journaux dans un fichier.

  2. représente une classe unique au monde.

D'un point de vue commercial, si certaines données ne doivent être enregistrées qu'en une seule copie dans le système, il est plus approprié de les concevoir comme une classe singleton. Par exemple : générateur de numéro d'identification croissant unique.

Méthode d'implémentation

Il faut trois étapes pour implémenter le mode singleton de PHP

* Une variable membre statique utilisée pour sauvegarder la classe.

* Pour empêcher la création ou le clonage d'objets, __construct et __clone doivent être déclarés privés.

* Une méthode statique publique pour accéder à cette instance, généralement getInstance

class single
{
    private static  $instance ;
    private function __construct(){}
    private function __clone(){}
    public static function getInstance() {
        if (empty(self::$instance)) {
            self::$instance = new single();
        }
        return self::$instance;
    }
}

Ajoutez une méthode à la classe singleton pour obtenir l'ID. Un générateur de numéro d'identification unique au monde apparaît.

class single
{
    private  $id = 0;
    private static  $instance ;
    private function __construct(){}
    private function __clone(){}
    public static function getInstance() {
        if (empty(self::$instance)) {
            self::$instance = new single();
        }
        return self::$instance;
    }
    public function getId() {
        
        return $this->id++;
        
    }
}

C'est vraiment impeccable, alors que se passe-t-il dans le cas du multi-threading ?

Implémentation de la seule instance unique d'un thread

Je dois mentionner la différence entre les versions ts et nts de php, nts (Non Thread Safe) construction à thread unique, données de cache partagées entre les threads. ts (Thread Safe) est construit avec des capacités multithread et utilise différentes copies de données entre plusieurs threads.

L'utilisation de la version ts de php sera automatiquement mise à niveau vers le mode thread-safe. L'extension pthreads ne peut être installée que sur la version ts de php.

La dernière version de pthreads incluse dans pecl est basée sur php7.0. Le projet pthreads sur github a également arrêté la mise à jour. Si vous êtes intéressé, vous ne pouvez passer qu'à la version 7.0 pour manquer l'historique.

J'ai installé l'extension pthreads sous la version php-7.0.9-Win32-VC14-x64.

Dans le cas du multi-threading, la portée du singleton passe de processus uniquement à thread uniquement.

require 'single.php';
class Request extends Thread {
    public $url;
    public function __construct($url) {
        $this->url = $url;
    }
    public function run() {
        echo single::getInstance()->getId();
        echo "\n";
    }
}
$chG = new Request("www.google");
$chG ->start();
$chG->join();
echo $chG->getThreadId();
echo "\n";
$chB = new Request("www.baidu");
$chB ->start();
$chB->join();
echo $chB->getThreadId();
echo "\n";

Deux threads sont créés ici, mais l'ID commençant à 0 peut être obtenu dans les deux exécutions, indiquant que les classes uniques dans les deux threads sont deux objets singleton différents.

Résumé

Il faut trois étapes pour implémenter le mode singleton de PHP

*A Les variables membres statiques sont utilisées pour enregistrer les classes.

* __construct et __clone sont déclarés privés pour empêcher la création ou le clonage.

* Une méthode statique, généralement getInstance, utilisée pour accéder à cette instance.

Je n'ai jamais utilisé le multi-threading en PHP. Cela semble être un point de non-retour. Je ne sais pas ce que tout le monde pense.

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn