PHPphp 调用单例模式式,可以调用多个类吗

php单例模式实现(对象只被创建一次)
php单例模式实现(对象只被创建一次)
  单例类至少拥有以下三种公共元素:
  必须拥有一个构造函数,并且必须被标记为private。&&& 拥有一个保存类的实例的静态成员变量。&&& 拥有一个访问这个实例的公共的静态方法
  具体使用方面,我在下面php实例中注释的很清楚:  复制代码 代码如下:  &?php&/**& * by & */&class Mysql{&&//该属性用来保存实例&&private static $&&//构造函数为private,防止创建对象&&private function __construct(){&&&$this-&conn = mysql_connect('localhost','root','');&&}&&//创建一个用来实例化对象的方法&&public static function getInstance(){&&&if(!(self::$conn instanceof self)){&&&&self::$conn =&&&}&&&return self::$&&}&&//防止对象被复制&&public function __clone(){&&&trigger_error('Clone is not allowed !');&&}&}&//只能这样取得实例,不能new 和 clone&$mysql = Mysql::getInstance();?&
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&PHP单例模式详细介绍
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了PHP单例模式详细介绍,本文讲解了单例模式的概念、单例模式的特点、使用单例模式的原因及场景及PHP单例模式代码实例,需要的朋友可以参考下
单例模式的概念
单例模式是指整个应用中某个类只有一个对象实例的设计模式。具体来说,作为对象的创建方式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
单例模式的特点
单例模式的主要特点是“三私一公”:
需要一个保存类的唯一实例的私有静态成员变量
构造函数必须声明为私有的,防止外部程序new一个对象从而失去单例的意义
克隆函数必须声明为私有的,防止对象被克隆
必须提供一个访问这个实例的公共静态方法(通常命名为getInstance),从而返回唯一实例的一个引用。
使用单例模式的原因及场景
在PHP的大多数应用中都会存在大量的数据库操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的系统资源和内存资源,而且每次打开和关闭数据库都是对数据库的一种极大考验和浪费。所以单例模式经常用在数据库操作类中。
同样,如果系统中需要有一个类来全局控制某些配置信息,那使用单例模式可以很方便的实现。
PHP单例模式实现
下面是一个PHP单例模式实现数据库操作类的框架
const DB_HOST='localhost';
const DB_NAME='';
const DB_USER='';
const DB_PWD='';
private $_
//保存实例的私有静态变量
private static $_
//构造函数和克隆函数都声明为私有的
private function __construct(){
//$this-&_db=mysql_connect();
private function __clone(){
//访问实例的公共静态方法
public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance=new self();
if(self::$_instance===null){
self::$_instance=new Db();
return self::$_
public function fetchAll(){
public function fetchRow(){
//类外部获取实例的引用
$db=Db::getInstance();
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具降低数据库访问压力的一个好措施
服务器君一共花费了521.839 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议
最近感觉网站的数据库压力比较大,造成网站的速度下降得很厉害。因为有相当一部分的页面是直接连接数据库读数据的,所以把这部分的页面也改为使用数据库单例类来实现。现在基本都统一使用下面这个类来连接数据库了。
class nmdb
static private $_
// 连接数据库
private function __construct($host, $username, $password)
$this->link = mysql_connect($host, $username, $password);
$this->query("SET NAMES 'utf8'", $this->link);
//echo mysql_errno($this->link) . ": " . mysql_error($link). "n";
//var_dump($this->link);
return $this->
private function __clone(){}
public static function get_class_nmdb($host, $username, $password)
//$connector = new nmdb($host, $username, $password);
//return $
if( FALSE == (self::$_instance instanceof self) )
self::$_instance = new self($host, $username, $password);
return self::$_
// 连接数据表
public function select_db($database)
$this->result = mysql_select_db($database);
return $this->
// 执行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);
这个类的使用如下:
$connector = nmdb::get_class_nmdb($host, $username, $password);
$connector -> select_db($database);
下面的类也可以参考下:
* mysql 单例
class mysql{
private $host
='localhost'; //数据库主机
private $user
= 'root'; //数据库用户名
private $pwd
= ''; //数据库用户名密码
private $database = 'imoro_imoro'; //数据库名
private $charset = 'utf8'; //数据库编码,GBK,UTF8,gb2312
//数据库连接标识;
//查询获取的多行数组
static $_ //存储对象
* 构造函数
private function __construct($pconnect = false) {
if (!$pconnect) {
$this->link = @ mysql_connect($this->host, $this->user, $this->pwd) or $this->err();
$this->link = @ mysql_pconnect($this->host, $this->user, $this->pwd) or $this->err();
mysql_select_db($this->database) or $this->err();
$this->query("SET NAMES '{$this->charset}'", $this->link);
return $this->
* 防止被克隆
private function __clone(){}
public static function getInstance($pconnect = false){
if(FALSE == (self::$_instance instanceof self)){
self::$_instance = new self($pconnect);
return self::$_
public function query($sql, $link = '') {
$this->result = mysql_query($sql, $this->link) or $this->err($sql);
return $this->
* 单行记录
public function getRow($sql, $type = MYSQL_ASSOC) {
$result = $this->query($sql);
return @ mysql_fetch_array($result, $type);
* 多行记录
public function getRows($sql, $type = MYSQL_ASSOC) {
$result = $this->query($sql);
while ($row = @ mysql_fetch_array($result, $type)) {
$this->rows[] = $
return $this->
* 错误信息输出
protected function err($sql = null) {
//这里输出错误信息
echo 'error';
$db = mysql::getInstance();
$db2 = mysql::getInstance();
$data = $db->getRows('select * from blog');
//print_r($data);
//判断两个对象是否相等
if($db === $db2){
echo 'true';
本文地址:,欢迎访问原出处。
不打个分吗?
转载随意,但请带上本文地址:
如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 。
大家都在看
现代魔法研究协会欢迎你
阅读一百本计算机著作吧,少年
Jon Bentley (作者), 黄倩 (译者), 钱丽艳 (译者)
《编程珠玑(第2版)》是计算机科学方面的经典名著。书的内容围绕程序设计人员面对的一系列实际问题展开。作者Jon Bentley 以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯中至关重要的。
扫一扫,在手机上阅读
栏目最新博文
7,385 views
43,368 views
18,806 views
32,263 views
32,595 views
24,621 views
54,096 views
52,283 views
24,651 views
58,893 views
栏目博文推荐
21,882 views
4,813 views
13,641 views
23,024 views
10,910 views
13,066 views
9,491 views
6,777 views
9,545 views
13,430 views
解决问题90%靠经验,5%靠技术,剩下5%靠运气。
关于网站与作者
互联网信息太多太杂,各互联网公司不断推送娱乐花边新闻,SNS,微博不断转移我们的注意力。但是,我们的时间和精力却是有限的。这里是互联网浩瀚的海洋中的一座宁静与美丽的小岛,供开发者歇息与静心潜心修炼(愿景)。
“Veda”的本义是知识、启示,希望这里能为开发者提供充足的技术资料。
我的电子邮件gonnsai(,腾讯微博:,欢迎与我联系。PHP单例模式和工厂模式小记! - 简书
PHP单例模式和工厂模式小记!
new stdClass()
== object(null);
//在php语言中,一个对象还可以使用clone运算符进行克隆,则就也会“生成”新对象。
//因此,还需要在类中使用私有化措施来禁止克隆,最终,单例模式的实现如下:
//单例模式4个关键点
public $v = 10;
private static $//存储实例化的类
private function __Construct(){}//私有化构造方法
public static function getNew(){
if(!isset(self::$state)){//如果没有实例化则实例化,实例化则直接返回
self::$state =
return self::$
private function __clone(){}//禁止克隆
= S::getNew();
= S::getNew();
var_dump($s);
var_dump($m);
//项目中的工厂类
//生成模型的单列对象
public static function M($name){
static $list = array();//存储已实例化的模型对象列表
if(!isset($list[$name])){//判断当前模型是否已实例化
require_once'./'.$name.'.class.php';
$list[$name] = new $//可变类
return $list[$name];
//类名,也习惯上(推荐)使用跟文件名相似的名字
//定义一个mysql连接类,该类可以连接mysql数据库
//并实现其单例模式
//该类的功能还能够完成如下基本mysql操作:
//执行普通的增删改非返回结果集的语句
//执行select语句并可以返回3种类型的数据:
//多行结果(二维数组),单行结果(一维数组)
//单行单列(单个数据)
class MySQLDB{
//连接结果(资源)
private static $
public static function getInstance($config){
if(!isset(self::$link)){
self::$link = new self($config);
return self::$
//构造函数:禁止new
private function __construct($config){
//初始化数据
$this-&host = isset($config['host']) ? $config['host'] : 'localhost';
$this-&port = isset($config['port']) ? $config['port'] : '3306';
$this-&username = isset($config['username']) ? $config['username'] : 'root';
$this-&password = isset($config['password']) ? $config['password'] : '';
$this-&charset = isset($config['charset']) ? $config['charset'] : 'utf8';
$this-&dbname = isset($config['dbname']) ? $config['dbname'] : '';
//连接数据库
$this-&connect();
//设定连接编码
$this-&setCharset($this-&charset);
//选定数据库
$this-&selectDb($this-&dbname);
//禁止克隆
private function __clone(){}
//这里进行连接
private function connect(){
$this-&resourc = mysql_connect("$this-&host:$this-&port", "$this-&username","$this-&password") or die("连接数据库失败!");
public function setCharset($charset){
//mysql_set_charset($charset, $this-&resourc);
$this-&query("set names $charset");
public function selectDb($dbname){
//mysql_select_db($dbname, $this-&resourc);
$this-&query("use $") ;
//进行序列化的时候会调用
public function __sleep(){
echo "序列化。。。";
mysql_close($this-&resourc);//关闭连接资源(清理资源)
//如果定义了该__sleep方法,则此时必须返回数组,才能进行序列化
return array('host','port','username','password','charset','dbname');
//进行反序列化的时候会调用
public function __wakeup(){
//连接数据库
$this-&connect();
//设定连接编码
$this-&setCharset($this-&charset);
//选定数据库
$this-&selectDb($this-&dbname);
* 功能:执行最基本(任何)sql语句
* 返回:如果失败直接结束,如果成功,返回执行结果
public function query($sql){
if(!$result = mysql_query($sql, $this-&resourc))
echo ("&br /&执行失败。");
echo "&br /&失败的sql语句为:" . $
echo "&br /&出错信息为:" . mysql_error();
echo "&br /&错误代号为:" . mysql_errno();
* 功能:执行select语句,返回2维数组
* 参数:$sql 字符串类型 select语句
public function getAll($sql){
$result = $this-&query($sql);
$arr = array();
while( $rec = mysql_fetch_assoc( $result )){
$arr[] = $//这样就形成二维数组
//返回一行数据(作为一维数组)
public function getRow($sql){
$result = $this-&query($sql);
//$rec = array();
if( $rec2 = mysql_fetch_assoc( $result )){//返回下标为字段名的数组
//如果fetch出来有数据(也就是取得了一行数据),结果自然是数组
return $rec2;
//返回一个数据(select语句的第一行第一列)
//比如常见的:select count(*) as c from XXX where ...
public function getOne($sql){
$result = $this-&query($sql);
$rec = mysql_fetch_row($result);//返回下标为数字的数组,且下标一定是0,1,2, 3.....
//如果没有数据,返回false
if($rec === false){
return $rec[0];
//该数组的第一项。
require './MySQLDB.class.php';
$dao = MySQLDB::getInstance($config);//$dao , Database Access Object 数据库操作对象(dao层)
//获得比赛列表数据
$sql = "select *";
$match_list = $dao-&getAll($sql);
养成记笔记的习惯!
https://DiorsCoder.github.io
https://DragonersLi.github.iophp单例模式的简单实现方法
投稿:jingxian
字体:[ ] 类型:转载 时间:
下面小编就为大家带来一篇php单例模式的简单实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
php单例模式的简单实现方法
* 设计模式之单例模式
* $_instance必须声明为静态的私有变量
* 构造函数和析构函数必须声明为私有,防止外部程序new
* 类从而失去单例模式的意义
* getInstance()方法必须设置为公有的,必须调用此方法
* 以返回实例的一个引用
* ::操作符只能访问静态变量和静态函数
* new对象都会消耗内存
* 使用场景:最常用的地方是数据库连接。
* 使用单例模式生成一个对象后,
* 该对象可以被其它众多对象所使用。
class Example
//保存例实例在此属性中
private static $_
//构造函数声明为private,防止直接创建对象
private function __construct()
echo 'I am Construceted';
//单例方法
public static function singleton()
if(!isset(self::$_instance))
$c=__CLASS__;
self::$_instance=new $c;
return self::$_
//阻止用户复制对象实例
public function __clone()
trigger_error('Clone is not allow' ,E_USER_ERROR);
function test()
echo("test");
// 这个写法会出错,因为构造方法被声明为private
$test = new E
// 下面将得到Example类的单例对象
$test = Example::singleton();
$test-&test();
// 复制对象将导致一个E_USER_ERROR.
$test_clone = clone $
首先我们要知道明确单例模式这个概念,那么什么是单例模式呢?
单例模式顾名思义,就是只有一个实例。
作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,
这个类我们称之为单例类。
单例模式的要点有三个:
一是某个类只能有一个实例;
二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。
下面我们讨论下为什么要使用PHP单例模式?
多数 人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种"计划生育". 而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位失望. 但是单例仅仅只有这个功能和应用吗? 答案是否定的,我们一起来看看。
1. php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源。
2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分。
3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。
以上这篇php单例模式的简单实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 java单例模式调用 的文章

 

随机推荐