Maison >développement back-end >tutoriel php >Explication détaillée du modèle singleton en PHP

Explication détaillée du modèle singleton en PHP

小云云
小云云original
2018-03-27 16:08:072176parcourir

Cet article partage principalement avec vous l'explication détaillée du mode singleton en PHP. En fait, le mode singleton est facile à comprendre, le mode singleton n'a qu'une seule instance en tant que mode de création d'objet. Le mode singleton garantit qu'une certaine classe n'a qu'une seule instance, instanciez-la vous-même et fournissez cette instance à l'ensemble du système.

Trois points clés du modèle singleton :

 1. Une classe ne peut avoir qu'une seule instance.

 2. Vous devez créer cette instance vous-même.

 3. Vous devez fournir vous-même cette instance à l'ensemble du système.

Pourquoi utiliser le modèle PHP singleton ?

1. Un aspect majeur des applications PHP concerne les bases de données. Il y aura un grand nombre d'opérations de base de données dans une application lors du développement orienté objet, si vous utilisez le mode singleton, vous pouvez éviter. un grand nombre d'opérations de base de données. Les ressources consommées par la nouvelle opération peuvent également réduire les connexions à la base de données, de sorte qu'un trop grand nombre de connexions est moins susceptible de se produire.

2. Si une classe est nécessaire pour contrôler globalement certaines informations de configuration dans un système, elle peut alors être facilement implémentée en utilisant le mode singleton.

3. Il est facile de déboguer dans une requête de page, car tout le code est concentré dans une seule classe, vous pouvez définir des hooks dans la classe, générer des journaux et éviter var_dump() et faire écho partout.

Cet exemple est suffisant pour comprendre en profondeur la magie du mode d'intérêt unique :

<?php/**
 * 设计模式之单例模式
 * $_instance必须声明为静态的私有变量
 * 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
 * getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用
 * ::操作符只能访问静态变量和静态函数
 * new对象都会消耗内存
 * 使用场景:最常用的地方是数据库连接。
 * 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。 */class Girlfriend
{    //保存例实例在此属性中
    private static $_instance;    //构造函数声明为private,防止直接创建对象
    private function __construct()
    {        echo &#39;实例初始化了!&#39;;
    }    //单例方法
    public static function get_instance()
    {        var_dump(isset(self::$_instance));        if(!isset(self::$_instance))
        {
            self::$_instance=new self();
        }        return self::$_instance;
    }    //阻止用户复制对象实例
    private function __clone()
    {        trigger_error(&#39;禁止克隆&#39; ,E_USER_ERROR);
    }    function test()
    {        echo("here is a test");
    }
}// 这个写法会出错,因为构造方法被声明为private
//$test = new Girlfriend;
// 下面将得到该类的单例对象$test = Girlfriend::get_instance();$test = Girlfriend::get_instance();$test->test();// 复制对象将导致一个E_USER_ERROR.
//$test_clone = clone $test;

Les deux appels ci-dessus : Girlfriend::get_instance() et le constructeur n'est appelé qu'une seule fois lorsque le l'instance initiale est utilisée, et le var_dump(isset(self::$_instance)) initial renvoie false, et le constructeur n'est pas affiché dans plusieurs instances suivantes... var_dump(isset(self::$_instance)) renvoie tous true. . .
Une classe digne de ce nom n'a qu'une seule instance... Je pense que tout le monde peut comprendre cet exemple en profondeur.

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