Maison  >  Article  >  développement back-end  >  Exemple d'analyse du mode PHP singleton

Exemple d'analyse du mode PHP singleton

黄舟
黄舟original
2017-10-11 09:28:091437parcourir

Mode Singleton Comme son nom l'indique, il n'y a qu'une seule instance. En tant que mode de création d'objet, le mode singleton garantit qu'il n'y a qu'une seule instance d'une certaine classe, et il s'instancie et la fournit. exemple à 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 de l'application PHP concerne Concernant. la base 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 de ressources consommées par de nouvelles opérations et réduire les connexions à la base de données, donc qu'il est moins probable qu'une situation de trop de connexions se produise.

 2. Si un système a besoin d'une classe pour contrôler globalement certaines informations de configuration, il peut être facilement implémenté à l'aide du modèle singleton.

3. Il est facile de déboguer en une seule page, car tout le code est concentré dans une seule classe et des hooks peuvent être définis dans la classe pour sortir logs et évitez var_dump(), faites écho partout.

Cas :


/**
 * 设计模式之单例模式
 * $_instance必须声明为静态的私有变量
 * 构造函数必须声明为私有,防止外部程序new类从而失去单例模式的意义
 * getInstance()方法必须设置为公有的,必须调用此方法以返回实例的一个引用
 * ::操作符只能访问静态变量和静态函数
 * new对象都会消耗内存
 * 使用场景:最常用的地方是数据库连接。
 * 使用单例模式生成一个对象后,该对象可以被其它众多对象所使用。
 */
class man
{
    //保存例实例在此属性中
    private static $_instance;

    //构造函数声明为private,防止直接创建对象
    private function __construct()
    {
        echo '我被实例化了!';
    }

    //单例方法
    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('Clone is not allow' ,E_USER_ERROR);
    }

    function test()
    {
        echo("test");

    }
}

// 这个写法会出错,因为构造方法被声明为private
//$test = new man;

// 下面将得到Example类的单例对象
$test = man::get_instance();
$test = man::get_instance();
$test->test();

// 复制对象将导致一个E_USER_ERROR.
//$test_clone = clone $test;

S'il y a quelque chose qui ne va pas, veuillez me corriger.

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