热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP单例模式实例浅析

全局变量是面向对象程序员遇到的引发bug的主要原因之一,这是因为全局变量将类捆绑于特定的环境,破坏了封装,如果新的应用程序无法保证一开始就定义了相同的环境变量,那么一个依赖于全局变

全局变量是面向对象程序员遇到的引发bug的主要原因之一,这是因为全局变量将类捆绑于特定的环境,破坏了封装,如果新的应用程序无法保证一开始就定义了相同的环境变量,那么一个依赖于全局变量的类就无法从一个应用程序中提取出来并应用到新的应用程序中.

什么是单例模式呢

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

单例模式的要点有三个:

它们必须拥有一个构造函数,并且必须被标记为private,它们拥有一个保存类的实例的静态成员变量,它们拥有一个访问这个实例的公共的静态方法,和普通类不同的是,单例类不能在其他类中直接实例化,单例类只能被其自身实例化,要获得这样的一种结果,__construct()方法必须被标记为private,如果试图用private构造函数构造一个类,就会得到一个可访问性级别的错误.

要让单例类起作用,就必须使其为其他类提供一个实例,用它调用各种方法,单例类不会创建实例副本,而是会向单例类内部存储的实例返回一个引用,结果是单例类不会重复占用内存和系统资源,从而让应用程序的其它部分更好地使用这些资源,作为这一模式的一部分,必须创建一个空的私有__clone()方法,以防止对象被复制或克隆.

返回实例引用的这个方法通常被命名为getInstance(),这个方法必须是静态的,而且如果它还没有实例化,就必须进行实例化,getInstance() 方法通过使用 instanceof 操作符和self 关键字,可以检测到类是否已经被实例化,代码如下:

header("Content-type:text/html;charset=utf-8"); 
	//单例测试类 
	class Test { 
	    private $unique; 
	    static private $instance;//静态属性保存该类实例 
	       
	    private function __construct(){//构造方法私有(防止外界调用) 
	        $this->unique=rand(0,20000); 
	    } 
	    static public function getInstance(){//静态方法提供对外接口(获取实例) 
	        if(!self::$instance instanceof self){ 
	            self::$instance=new self(); 
	        } 
	        return self::$instance; 
	    } 
	    private function __clone(){}//私有克隆方法,防止外界直接克隆该实例 
	      
	} 
	$test=Test::getInstance(); 
	$test2=Test::getInstance(); 
	  
	print_r($test);  
	print_r($test2); 
	      
	if($test===$test2){ 
	    echo '相等!'; 
	}else{ 
	    echo '不相等!'; 
	}

好了,该说书代码了,我们在程序中查询数据的操作会非常非常的多,我们不可能每次都new一个对象,这样太耗费开销了,那么我们怎么办呢,单例模式是个不错的选择,单例模式,只能实例化一次,下面看一下代码.

db.class.php,代码如下:

conn = mysql_connect($db['host'], $db['user'], $db['psd']);
        if (!mysql_select_db($db['databases'], $this->conn)) {
            echo "数据库连接错误";
        }
        mysql_query('set names utf8', $this->conn);
    }
    public static function getInstance() {
        if (is_null(self::$instact)) {
            self::$instact = new db;
        }
        return self::$instact;
    }
    /** 
     *数据查询
     */
    public function select($table, $condition = array() , $field = array()) {
        $where = "";
        if (!emptyempty($condition)) {
            foreach ($condition as $k => $v) {
                $where.= $k . "='" . $v . "' and ";
            }
            $where = "where " . $where . " 1=1";
        }
        if (!emptyempty($field)) {
            foreach ($field as $k => $v) {
                $fieldstr.= $v . ",";
            }
            $fieldstr = rtrim($fieldstr);
        } else {
            $fieldstr = "*";
        }
        self::$sql = "select {$fieldstr} from {$table} {$where}";
        $result = mysql_query(self::$sql);
        $i = 0;
        while ($row = mysql_fetch_assoc($result)) {
            foreach ($row as $k => $v) {
                $resultrow[$i][$k] = $v;
            }
            $i++;
        }
        var_dump($resultrow);
    }
    /** 
     *数据添加
     */
    public function insert($table, $data) {
        $values = "";
        $datas = "";
        foreach ($data as $k => $v) {
            $values.= $k . ",";
            $datas.= "'$v'" . ",";
        }
        $values = rtrim($values, ',');
        $datas = rtrim($datas, ',');
        self::$sql = "insert into {$table}({$values}) values ({$datas})";
        if (mysql_query(self::$sql)) {
            return mysql_insert_id();
        } else {
            return false;
        };
    }
    /** 
     *数据更新
     */
    public function update($table, $data, $condition = array()) {
        $where = "";
        if (!emptyempty($condition)) {
            foreach ($condition as $k => $v) {
                $where.= $k . "=" . $v . " and ";
            }
            $where = "where " . $where . "1=1";
        }
        $updatastr = "";
        if (!emptyempty($data)) {
            foreach ($data as $k => $v) {
                $updatastr.= $k . "='" . $v . "',";
            }
            $updatastr = "set " . rtrim($updatastr, ",");
        }
        self::$sql = "update {$table} {$updatastr} {$where}";
        return mysql_query(self::$sql);
    }
    /** 
     *数据 删除
     */
    public function delete($table, $condition) {
        $where = "";
        if (!emptyempty($condition)) {
            foreach ($condition as $k => $v) {
                $where.= $k . "='" . $v . "' and ";
            }
            $where = "where " . $where . '1=1';
        }
        self::$sql = "delete from {$table}  {$where}";
        return mysql_query(self::$sql);
    }
    //打印sql
    public function getlastsql() {
        echo self::$sql;
    }
}
$ne = db::getInstance();
//$ne->update('message',array('user'=>'wanghao','title'=>'sd'),array('id'=>'5'));
//echo $db->insert('message',array('user'=>'张三','title'=>'demo'));
$ne->select('message', array(
    'user' => 'songlin'
));
$ne->getlastsql();

数据库的配置文件,db.config.php:

$host, 
	"user" =>$user, 
	"psd" =>$psd, 
	"databases"=>$databases 
	); 	



推荐阅读
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
author-avatar
老娘叫凌凌_523
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有