• PHP单例模式及应用场


    设计模式?听起来很高大上?的确是这样的。设计模式就是组织代码的方式,也就是说代码不再是一条条的往下执行,按照前人总结的行之有效的方法,更有效的来组织代码,这样效率更高,而且看起来也清晰有序。

    php单例模式,起初不是很熟悉,是在看MVC框架源代码的时候才注意到的,设计模式在框架的设计应用中很广泛,因此框架的代码更有序高效。

    单例模式顾名思义,就是只有一个实例。作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类我们称为单例类。

    单例模式有三个特点:

    1.某个类只能有一个实例。

    2.这个类必须自己创建这个实例。

    3.这个类必须自行向系统提供这个实例。

    为什幺使用"单例模式"?

    先看一段代码:(这是一个数据库连接类)

    <?php  
    class Mysql  
    {  
        // MYSQL数据库连接信息  
        const HOSTNAME = "127.0.0.1";  
        const USERNAME = "root";  
        const PASSWORD = "***";  
        const DBNAME = "test";  
        const CHARSET = "utf8";  
     
        public function MysqlConnect()  
        {  
            $db = new mysqli(self::HOSTNAME, self::USERNAEM, self::PASSWORD, self::DBNAME); // 连接数据库  
            $db->query("set names ".self::CHARSET);  
            if (mysqli_connect_errno())  
            {  
                throw new MysqlException("服务器系统故障", 1001);  
            }  
            else  
            {  
                return $db;  
            }  
        }  
    }  
    ?>
    View Code

    每次数据库连接都要new这个类,然后调用mysqlconnect方法,返回连接,然后close掉连接,频繁的new和数据库连接关闭操作非常的消耗资源!数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。

    因此,为了避免资源消耗,我们有了下面的改进:

    <?php
        class Mysql{
            //该属性用来保存实例
            private static $conn;
            //构造函数为private,防止创建对象
            private function __construct(){
                $this->conn = mysql_connect('localhost','root','');
            }
            //创建一个用来实例化对象的方法
            public static function getInstance(){
                if(!(self::$conn instanceof self)){
                    self::$conn = new self;
                }
                return self::$conn;
            }
            //防止对象被复制
            public function __clone(){
                trigger_error('Clone is not allowed !');
            }
            
        }
        //只能这样取得实例,不能new 和 clone
        $mysql = Mysql::getInstance();
    ?>
    View Code

    这样就不用每次都来new这个类了,方便了很多。下面给一个详细的:

    <?php
    class  Mysql
    {
        private $DB;
        static private $_instance;
        // 连接数据库
        private function __construct($host, $username, $password)
        {
            $this->DB = mysql_connect($host, $username, $password);
            $this->query("SET NAMES 'utf8'", $this->link);
            return $this->DB;
        }
        
        private function __clone(){}
        
        public static function getInstance($host, $username, $password)
        {    
            if( !(self::$_instance instanceof self) )
            {
                self::$_instance = new self($host, $username, $password);
            }
            return self::$_instance;
        }
        
        // 连接数据表
        public function select_db($database)
        {
            $this->result = mysql_select_db($database);
            return $this->result;
        }
        
        // 执行SQL语句
        public function query($query)
        {
            return $this->result = mysql_query($query, $this->link);
        }
        
        // 将结果集保存为数组
        public function fetch_array($fetch_array)
        {
            return $this->result = mysql_fetch_array($fetch_array, MYSQL_ASSOC);
        }
        
        // 获得记录数目
        public function num_rows($query)
        {
            return $this->result = mysql_num_rows($query);
        }
        
        // 关闭数据库连接
        public function close()
        {
            return $this->result = mysql_close($this->link);
        }
        
    }
    ?>
    View Code

    使用的时候:

    $con = Mysql::getInstance($host, $username, $password);
    $con -> select_db($database);

    当然,单例模式不仅仅只是应用在数据库的操作类上面。还可以应用在这些方面:

    1. 网站的计数器,一般也是采用单例模式实现,否则难以同步。

    2. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

    3. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。

                                         

    原出处https://www.cnblogs.com/miketwais/articles/Singleton_pattern.html

  • 相关阅读:
    [转载]「服务」WCF中NetNamedPipeBinding的应用实例
    [转载] ABP框架理论学习之后台工作(Jobs)和后台工作者(Workers)
    .NET Core use NLog
    把.netcore console 安装到Windows 系统服务。
    利用Linq Skip() Take()分页
    C#访问Java的WebService添加SOAPHeader验证的问题
    马丁福勒 关于微服务特点的描述
    转载 springboot 配置读取
    luajit与NYI
    lua启用lua-resty-core
  • 原文地址:https://www.cnblogs.com/wyaokai/p/10383860.html
Copyright © 2020-2023  润新知