• 单例模式


    <?php
    class DB {
    private $_db;
    //静态是通过类::字段直接访问的,private表示外部不能访问
    static private $_instance;
    //访问这个实例的公共静态方法
    static public function getInstance() {
    //如果对象没有创建,就创建它,如果创建了,就直接返回
    if (!(self::$_instance instanceof self)) {
    self::$_instance = new self();
    }
    return self::$_instance;
    }
    //单一职责问题,私有化克隆
    private function __clone() {}
    //私有化构造方法,
    private function __construct() {
    try {
    $this->_db = new PDO('mysql:host=localhost;dbname=cms','root','yangfan');
    echo '创建了一次数据库链接对象';
    } catch (PDOException $e) {
    exit($e->getMessage());
    }
    }
    public function query($_sql) {
    return $this->_db->query($_sql);
    }
    }
    ?>

    单例类所需的三个公共元素:
    1.必须拥有一个构造方法,并且必须被标记为 private;
    2.拥有一个保存类的实例的静态成员属性(字段);
    3.拥有一个访问这个实例的公共的静态方法。

    虽然全局变量可以实现单例, 让整个内存流程清晰, 让对象保持一个, 但这是有代价的:
    1.全局变量处在特定的区域环境,破坏了整个类的封装;
    2.如果新的应用程序无法保证一开始就定了相同的全局变量, 那么这个类依赖与全局变
    量,就无法从一个应用中提取出来应用到新的应用程序上。(PS:因为没有封装在类里,如
    果全局变量不是在 DB.class.php,而是单独文件,往往就提取不到)。
    3.全局变量不受保护,也就是说,可以任意存放和修改。一旦依赖全局,随着项目的扩
    展,冲突在所难免。因为全局不变量不像类中的成员属性,如果冲突会提示警告报错,而全局变量不会。

    4.全局变量,并没有真正实现单例,如果在程序中不遵循类库提供个规范,而自己创建类,则还是会产生多个对象。

  • 相关阅读:
    内存、时间复杂度、CPU/GPU以及运行时间
    内存、时间复杂度、CPU/GPU以及运行时间
    四叉树问题
    四叉树问题
    基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【三】VGG网络进行特征提取
    爬楼梯问题种种
    爬楼梯问题种种
    Python 在线笔试
    基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【二】人脸预处理
    标准模板库 STL 使用之 —— vector 使用 tricks
  • 原文地址:https://www.cnblogs.com/jsmiao/p/4492048.html
Copyright © 2020-2023  润新知