PHP单例模式

原创 2018年04月15日 09:40:45

单例模式,一个类只允许实例化一个对象,节约内存。

上代码:

<?php

header("Content-Type:text/html;charset=utf-8");

//定义最终的单利的数据库操作类
final class Db{
	private static $obj = null;

	//私有的数据库配置信息
	private $dbHost;
	private $dbName;
	private $dbUser;
	private $dbPass;
	private $charset;

	//私有的构造方法
	private function __construct($conf){
		$this -> dbHost = $conf['dbHost'];
		$this -> dbUser = $conf['dbUser'];
		$this -> dbName = $conf['dbName'];
		$this -> dbPass = $conf['dbPass'];
		$this -> charset = $conf['charset'];
		$this->connectDb();
		$this->selectDb();
		$this->setCharset();
	}

	//私有的克隆方法
	private function __clone(){}
	public static function getInstance($conf){
		if(!self::$obj instanceof self){
			self::$obj = new self($conf);
		}
		return self::$obj;
	}

	//私有的连接数据库方法
	private function connectDb(){
		if(!@mysql_connect($this->dbHost,$this->dbUser,$this->dbPass)){
			die('PHP连接mysql出错');
		}
	}

	//私有的选择数据库方法
	private function selectDb(){
		if(!mysql_select_db($this->dbName)){
			die('连接数据库出错');
		}
	}

	//私有的选择字符集方法
	private function setCharset(){
		mysql_set_charset($this->charset);
	}

	//将sql语句分为两类,返回结果集和返回布尔值
	//返回布尔值
	public function exec($sql){
		//将sql语句转化为小写
		$sql = strtolower($sql);
		//判断是否为select语句
		if(substr($sql,0,6) == 'select'){
			die('不能执行select语句');
		}
		return mysql_query($sql);
	}

	//私有的执行select语句(结果集不能直接展示给前端,得经过处理返给对象)
	private function query($sql){
		//将sql语句转化为小写
		$sql = strtolower($sql);
		//判断是否为select语句
		if(substr($sql,0,6) != 'select'){
			die('只能执行select语句');
		}
		return mysql_query($sql);
		
	}
	
	//将查询到的结果集返回给前端(返回一条)
	public function fetchOne($sql,$type=3){
		$res = $this ->query($sql);
		$types = array(
				1 => MYSQL_NUM,
				2 => MYSQL_ASSOC,
				3 => MYSQL_BOTH,
			);
		//返回一条记录
		return mysql_fetch_array($res,$types[$type]);
	}

	//将查询到的结果集返回给前端(返回多条)
	public function fetchAll($sql,$type=2){
		$res = $this ->query($sql);
		$types = array(
				1 => MYSQL_NUM,
				2 => MYSQL_ASSOC,
				3 => MYSQL_BOTH,
			);
		while($row = mysql_fetch_array($res,$types[$type])){
			$arr[] = $row;
		}
		return $arr;
	}
	//公共的获取记录数的方法
	public function getCount($sql){
		$res= $this ->query($sql);
		return mysql_num_rows($res);
	}
}

测试代码:

<?php

header("Content-Type:text/html;charset=utf-8");

//类的自动加载

spl_autoload_register(function ($className){
	$arr = array(
		"./libs/{$className}.class.php",
	);
	foreach($arr as $path){
		if(file_exists($path)){
			require_once($path);
		}
	}
});
$arr = array(
	'dbHost' => 'localhost',
	'dbUser' => 'root',
	'dbPass' => 'root',
	'dbName' => 'test',
	'charset' => 'utf8',
);
$db = Db::getInstance($arr);
$sql = "select * from account where id = 100;";
var_dump($db->fetchOne($sql,2));

php单例模式和工厂模式

  • 2009年05月22日 22:38
  • 54KB
  • 下载

单例模式——php单例模式的运用,用单例模式设计实现多例

不断学习不断进步的过程中,坚持用写作的方式记录学习成果真真是极好的习惯。最近笔者学习设计模式,正好有写博客的想法,于是第一篇博客就从设计模式中的一小个——单例模式讲起。     此文于php实现单例...
  • agangdi
  • agangdi
  • 2012-11-06 15:33:31
  • 2718

php单例模式的常见应用场景

单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此...
  • starrykey
  • starrykey
  • 2016-07-27 21:28:48
  • 2433

php单例模式的两种方法和检测方法

怎么算是个单例模式,怎么确认是单例模式?参考以下代码
  • u010703523
  • u010703523
  • 2015-06-12 15:47:52
  • 692

php单例模式使用实例之数据库连接

单例模式概念 单例模式是指整个应用中类只有一个对象实例的设计模式。 单例模式的特点 一个类在整个应用中只有一个实例类必须自行创建这个实例必须自行向整个系统提供这个实例 php中使用单例...
  • WangXiaoMing099
  • WangXiaoMing099
  • 2014-03-27 17:21:57
  • 1910

php如何实现单例模式

凡是讲到设计模式,无一例外的都会讲到单例模式,单例模式相对于其他设计模式来讲,要容易理解的多,但是要实现一个严格意义上的单例模式,很简单吗?...
  • wangshiliang1990
  • wangshiliang1990
  • 2016-08-12 01:30:57
  • 1926

PHP设计模式之单例模式简单代码介绍

PHP设计模式之单例模式 单例模式是一种创建型模式,它会限制应用程序,使其只能创建某一特定类类型的一个单一的实例。举例来说,一个web站点将会需要一个数据库连接对象,但是应该有且只能有一个,因此我们...
  • u012675743
  • u012675743
  • 2015-04-09 18:10:27
  • 1585

PHP单例模式访问数据库

  • 2013年09月05日 09:59
  • 873B
  • 下载

PHP单例模式示例代码

class MySingleton {  protected static $instance;    /**   * 获取单例对象   * @return MySingleton   *...
  • wgw335363240
  • wgw335363240
  • 2014-03-04 10:26:17
  • 888

php单例模式连接数据库--代码实现

单例模式在特定的情况下可以节省资源的消耗,例如同一页面对数据库的多次操作,不需要去new多次从而节省了资源。 单例模式的关键在于php中的“instanceof”,它用来检测一个变量是否是某个类的一...
  • ljl890705
  • ljl890705
  • 2016-06-24 14:52:35
  • 2742
收藏助手
不良信息举报
您举报文章:PHP单例模式
举报原因:
原因补充:

(最多只允许输入30个字)