php的php mysql 单例模式式有什么具体好处?具体在哪里实现?面试的时候让人问到..求解

这篇文章主要介绍了PHP单例模式详细介绍,本文讲解了单例模式的概念、单例模式的特点、使用单例模式的原因及场景及PHP单例模式代码实例,需要的朋友可以参考下单例模式的概念单例模式是指整个应用中某个类只有一个对象实例的设计模式。具体来说,作为对象的创建方式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。单例模式的特点单例模式的主要特点是“三私一公”:需要一个保存类的唯一实例的私有静态成员变量构造函数必须声明为私有的,防止外部程序new一个对象从而失去单例的意义克隆函数必须声明为私有的,防止对象被克隆必须提供一个访问这个实例的公共静态方法(通常命名为getInstance),从而返回唯一实例的一个引用。使用单例模式的原因及场景在PHP的大多数应用中都会存在大量的数据库操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的系统资源和内存资源,而且每次打开和关闭数据库都是对数据库的一种极大考验和浪费。所以单例模式经常用在数据库操作类中。同样,如果系统中需要有一个类来全局控制某些配置信息,那使用单例模式可以很方便的实现。PHP单例模式实现下面是一个PHP单例模式实现数据库操作类的框架?53637&?phpclass Db{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();?&最近更新:免责声明:本文仅代表作者个人观点,与本网无关。看完本文,记得打分哦:很好下载Doc格式文档马上分享给朋友:?知道苹果代表什么吗实用文章,深受网友追捧比较有用,值得网友借鉴没有价值,写作仍需努力相关综合教程:
48小时热门width:100%">
非常好,顶一下
width:100%">
支持,赞一个
width:100%">
楼主的战斗力已经恢复百分之六十二了!
width:100%">
看着帅锅犯二鸟要天天向上-顶!
width:100%">
12345678910
| 文网文[号 | 粤公网安备 42号 )
Comsenz Inc.基础编程:关于单例模式的有关问题,大牛进来撸~ - PHP当前位置:& &&&基础编程:关于单例模式的有关问题,大牛进来撸~基础编程:关于单例模式的有关问题,大牛进来撸~&&网友分享于:&&浏览:2次基础编程:关于单例模式的问题,大牛进来撸~~~&?phpclass Example{ &
// 保存类实例在此属性中 &
private static $ &
// 构造方法声明为private,防止直接创建对象 &
private function __construct()&
echo 'I am constructed&br&'; &
// singleton 方法 &
public static function singleton()&
if(!isset(self::$instance))
$c=__CLASS__;
self::$instance=new $c;&
return self::$ &
// Example类中的普通方法 &
public function bark() &
echo 'Woof!'; &
// 阻止用户复制对象实例 &
public function __clone() &
trigger_error('Clone is not allowed.', E_USER_ERROR); &
public function destroy() {
unset(self::$instance); }}// 这个写法会出错,因为构造方法被声明为private//$test = new E// 下面将得到Example类的单例对象$test = Example::singleton();$test-&bark();// 复制对象将导致一个E_USER_ERROR.//$test_clone = clone $$b=Example::singleton();$b-&destroy();?&原文:http://www.php.net/manual/zh/language.oop5.patterns.php这里我想问:1) $b=Example::singleton();
是生成一个新的对象 ,还是$test 和 $b 都指向 Example::singleton() 这个生成的对象?2) 为什么我 的
方法会出错?有没什么办法可以销毁 Example::singleton() 这个对象或说令它变成null,是不是这样就使得 $test 和 $b 同时变成了 null?------解决方案--------------------是private function __clone吧,单例的释放也不应该是析构函数做的,概念完全混淆了,应该提供独立的public static接口来释放单例对象。1,同一个对象2,上边已经说了,不会变成null的,你不应该再使用那两个变量了,因为对象是引用。
------解决方案--------------------写了个小测试PHP code
class hello
public static $i;
public static function getI()
if( ! self::$i instanceof self){
self::$i =
// 输出变量的一些信息
debug_zval_dump(self::$i);
// 你可以先注释掉这句
self::$i =
debug_zval_dump(self::$i);
return self::$i;
private function __construct(){}
private function __clone(){}
$i = hello::getI();
debug_zval_dump($i);
debug_zval_dump(hello::$i);
object(hello)#1 (0) refcount(2){
NULL refcount(2)
NULL refcount(3)
NULL refcount(3)
------解决方案--------------------自己也试了一下,一个对象自身一个引用,变量再引用就是2个引用,所以null和一开始的$i是这样情况,不知道对不对,不过对不对也不重要了。
------解决方案--------------------探讨2) 为什么我 的 destroy() 方法会出错?有没什么办法可以销毁 Example::singleton() 这个对象或说令它变成null,
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有PHP单例模式实现商城购物车功能
我的图书馆
PHP单例模式实现商城购物车功能
PHP单例模式实现商城购物车功能-PHP实例教程完成这个小功能必须会写需求 养成好的习惯 Php购物车的开发需求功能如下 1: 购物车放在session里 2: 单例模式来开发 功能: 增删改查 增一个商品 减少
  PHP单例模式实现商城购物车功能-PHP实例教程完成这个小功能必须会写需求 养成好的习惯
  Php购物车的开发需求功能如下:
  1: 购物车放在session里
  2: 单例模式来开发
  增删改查
  增一个商品
  减少一个商品(改,数量)
  去掉一个商品
  清空购物车
  返回所有商品列表
  一共有几种商品
  一共有几个商品
  购物车里商品一共多少钱
  当你了解php购物车原理后再来写代码就很简单了下面是写的购物车类
  php代码如下:
  class Cart{
  static protected $ //实例变量
  protected $item = array(); //放商品容器
  //禁止外部调用
  final protected function __construct(){
  //禁止克隆
  final protected function __clone(){
  //类内部实例化
  static protected function Getins(){
  if(!(self::$ins instanceof self)){
  self::$ins = new self();
  return self::$
  //为了能使商品跨页面保存,把对象放入session里
  public function Getcat(){
  if(!($_SESSION['cat']) || !($_SESSION['cat'] instanceof self)){
  $_SESSION['cat'] = self::Getins();
  return $_SESSION['cat'];
  //入列时的检验,是否在$item里存在.
  public function Initem($goods_id){
  if($this-&Gettype() == 0){
  if(!(array_key_exists($goods_id,$this-&item))){
  }else{
  return $this-&item[$goods_id]['num']; //返回此商品个数
  //添加一个商品
  public function Additem($goods_id,$name,$num,$price){
  if($this-&Initem($goods_id) != false){
  $this-&item[$goods_id]['num'] += $
  $this-&item[$goods_id] = array(); //一个商品为一个数组
  $this-&item[$goods_id]['num'] = $ //这一个商品的购买数量
  $this-&item[$goods_id]['name'] = $ //商品名字
  $this-&item[$goods_id]['price'] = $ //商品单价
  //减少一个商品
  public function Reduceitem($goods_id,$num){
  if($this-&Initem($goods_id) == false){
  if($num & $this-&Getunm($goods_id)){
  unset($this-&item[$goods_id]);
  }else{
  $this-&item[$goods_id]['num'] -=$
  //去掉一个商品
  public function Delitem($goods_id){
  if($this-&Initem($goods_id)){
  unset($this-&item[$goods_id]);
  //返回购买商品列表
  public function Itemlist(){
  return $this-&
  //一共有多少种商品
  public function Gettype(){
  return count($this-&item);
  //获得一种商品的总个数
  public function Getunm($goods_id){
  return $this-&item[$goods_id]['num'];
  // 查询购物车中有多少个商品
  public function Getnumber(){
  $num = 0;
  if($this-&Gettype() == 0){
  return 0;
  foreach($this-&item as $k=&$v){
  $num += $v['num'];
  return $
  //计算总价格
  public function Getprice(){
  $price = 0;
  if($this-&Gettype() == 0){
  return 0;
  foreach($this-&item as $k=&$v){
  $price += $v['num']*$v['num'];
  return $
  //清空购物车
  public function Emptyitem(){
  $this-&item = array();
  自己测试代码也拿出来
  include_once('Cart.php');
  $cart = Cart::Getcat();
  $cart-&Additem('1','谍匪','5','9999');
  print_r($cart);
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&2140人阅读
设计模式(1)
  不断学习不断进步的过程中,坚持用写作的方式记录学习成果真真是极好的习惯。最近笔者学习设计模式,正好有写博客的想法,于是第一篇博客就从设计模式中的一小个——单例模式讲起。
&   此文于php实现单例模式又略有些拓展,将使用单例模式的设计手法实现一个多例模式。应用场景如下:
& & & & & 因我公司的用户注册后每一个用户拥有一个独享的私人库,于是我们在代码实现的过程中会出来一个进程连接多个数据库的情况。然而对于数据库连接来说,一个进程中一个数据库连接一次关闭一次是再好不过的,于是使用单例模式实在是情理之中的事。两者结合,便有了以下内容。看官且莫嫌烦,搞清需求再代码实现真真是你们序员不可避免的正确的路子。
& & & & &弄清楚需求后,我们就开始代码实现了:
class MysqlConn{
/*根据我们的需求,我们要连接不同的数据库,但是会有一个常用的数据库连接,因此定义几个常量作为连接数据库的缺省值*/
const HOSTNAME = &localhost&;
const USERNAME = &root&;
const PASSWORD = &password&;
const DBNAME & = &mysql&;
const CHARSET &= &utf8&;
/*单例的精要所在便是一个类在一个进程只只生成一个对象,对于本类我们需要的只是数据库的连接句柄*/
/*instances 之所以为 static 是因为我们要用它来保存本类的唯一对象,于是需要在实例化对象之前对其是否存在进行判断*/
/*instances 之所以为 数组,是因为我们说过我们需要连接不同的数据库,实际上这不是一个严格的单例模式,是一个多例模式*/
private static $instances = array(); //静态属性,实现一个单例
private $ //返回一个数据库连接句柄
/* key 用来确实我们的唯一对象,一个 $instances[$key] 即为一个单例 */
/*构造函数连接数据库并获得句柄, private 禁止在类外实例化对象*/
private function __construct($hostname, $username, $password, $dbname){
$this -& db = new mysqli($hostname, $username, $password, $dbname);
$this -& db -& set_charset(self::CHARSET);
/* 使用数据库名字来作为确定一个单例,如果要连接不同域下的数据库,使用“域名”和“数据库”共同hash作为key值*/
$this -& key = $
if(mysqli_connect_errno()){
throw new Exception(&数据库连接失败&);
}catch(Exception $e){
$e -& getMessage();
}//end construct
/*以下三个 private 的方法都是为了禁止类外的调用,保证单例 */
/*禁止外部克隆对象*/
private function __clone(){}
/*禁止外部序列化对象*/
private function __sleep(){}
/*禁止外部反序列化对象*/
private function __wakeup(){}
/*获取一个单例,并指定参数缺省值,如果需要连接其他数据库,传入参数即可,否则参数可空*/
public static function getInstance($hostname = self::HOSTNAME, $username = self::USERNAME, $password = self::PASSWORD, $dbname = self::DBNAME){
if(!isset(self::$instances[$dbname])){
self::$instances[$dbname] = new self($hostname, $username, $password, $dbname);
var_dump(self::$instances[$dbname]);
return self::$instances[$dbname];
}//end getInstance
/*返回数据库连接句柄,因为我们之前的 this -& db 私有化,所以此所需要一个公开方法来返回*/
public function getDb(){
return $this -&
public function __destruct(){
$this -& db -& close();self::$instances[$this-&key] = NULL;
外部调用代码,如下:
require &MysqlConn.php&;
/*如果需要连接其他库,传入参数即可*/
$conn = MysqlConn::getInstance();
$db = $conn -& getDb();
& & & 最后,鄙人首次触及技术博客,也不知是否讲得清楚,欢迎众高人批证与加入讨论。在此特感谢与我一起研究单例模式的一哥(一哥现在还是小神,但是他有一天会是大神,因为其一直以大神的标准严格要求自己)和授于我们设计模式的大师兄。在此推荐一哥博客: 
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:151796次
积分:1750
积分:1750
排名:千里之外
原创:27篇
译文:11篇
评论:26条
(1)(1)(1)(1)(11)(2)(1)(2)(2)(2)(3)(2)(5)(5)}

我要回帖

更多关于 php 单例模式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信