在码PHP程序的时候,为了以后更好地维护代码和理解代码,用一些合适的设计模式是必不可少的,下面我和大家首先分享下单例模式,有错误或者不恰当的地方,还望PHPer们帮我指出。

  • 单例模式

PHP中的对象生存期间是从该脚本开始一直到该脚本结束为止,因此PHP的单例模式只是在一个页面中(这里可能包含很多其他页面,不是狭义的单页面)多次用到该对象时才会起作用,多次用到时不去重复的new对象(多个人做一个项目时,难免会碰到一次请求中多次实例一个对象的情况),将不会耗费不必要的资源(数据控连接操做效果很明显),还有一点就是可以保证整个脚本中都是同一个对象,这种模式是怎么实现的呢,他的实现有几个要注意的点:

1. 首先就是要将__construct()方法定义为私有方法,这样就不能通过new来得到一个新的实例了,单例模式不能在外部进行实例化,这能字自身内部进行实例化;

2. 同样要屏蔽__clone()方法,防止从类外部进行克隆

2. 然后就是定义一个用来保存实例的私有变量和获取私有变量的公有函数getInstance()。

<?php
/**
* 设计模式——单例模式
* @author 燕睿涛(luluyrt@163.com)
*/
class Singlemodel{
/**
* 保存Singlemodel实例的变量
* @var Singlemodel $_instance
*/
private static $_instance = null; /**
* 屏蔽掉通过new来实例化该对象
*/
private function __construct(){
//空函数就行
}
/**
     * 屏蔽掉通过clone来克隆该对象
*/ 
    private function __clone(){ 
//空函数就行 
    }
/**
* 通过该方法获取实例,防止多次实例化
*/
public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance = new self();
}
return self::$_instance;
} }

空口无凭,光说这些理论的没有说服力,下面通过例子来看下具体的效果差异

<?php
/**
* 设计模式——单例模式——测试
* @author 燕睿涛(luluyrt@163.com)
*/
class Singlemodel{
/**
* 保存Singlemodel实例的变量
* @var Singlemodel $_instance
*/
private static $_instance = null; private $_link = null;
/**
* 屏蔽掉通过new来实例化该对象(也可以去掉)
* 这里来测试数据库连接
*/
private function __construct(){
$this->_link = mysqli_connect("localhost","root","","mysql");
} /**
* 通过该方法获取实例,防止多次实例化
*/
public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance = new self();
}
return self::$_instance;
} /**
* 测试1,通过使用单例模式
*/
public static function testOne(){
return self::getInstance();
} /**
* 测试1,通过使用单例模式
*/
public static function testTwo(){
return new self();
} }
$obj = array();
$begin = microtime(true);
for($i=0;$i<100;$i++){
/*
* 这里进行两次测试,testOne应用了单例模式,testTwo没有应用单例模式,
* 我们分别看看他们占用的资源和耗费的时间
*/
//$obj[$i] = Singlemodel::testOne();
$obj[$i] = Singlemodel::testTwo();
}
echo "程序运行期间最大内存占用:".memory_get_peak_usage()."bytes\r";
echo "程序运行耗时:".floatval(microtime(true) - $begin)."s\r";

先注释$obj[$i] = Singlemodel::testTwo();这一行,使用单例模式,我们可以得到下面的结果

然后注释掉$obj[$i] = Singlemodel::testOne();,使用非单例模式,我们得到下面结果

可以看到

100次测试 单例模式 普通模式 普通/单例(倍)
内存(bytes) 143816 847376 5.89
时间(s) 0.0112519 0.2541389 22.59
5次测试      
bytes 140432 168984 1.20
s 0.0112612 0.0173110 1.54

可以看到当一次脚本执行的链接数为100时单例模式的性能比普通模式在内存占用方面好了将近6倍,时间上快了将近23倍,当连接数继续增加的时候倍数会更大,因为单例模式耗费的内存和时间基本没有变化,非单例模式会不停地增大,这里要注意一点就是非单例模式情况下链接数增大到一定程度时会报错"mysqli_connect(): (08004/1040): Trop de connexions in",意思是说并发连接太多了,测试我们可以通过下面的命令查看mysql最大连接数设置,这点需要注意下,免得不知道为什么报错。

show variables like 'max_connections';

到这里,你要是自己测试过就会发现,当链接次数比较少时,差异是比较小的(就像上面的一次请求有5次连接时),其实在一次请求中达到很多次实例化也是比较少的,那么是不是说这个就没作用了呢,当然不是,你想想看,首先,这样可以尽量避免多次实例化,减小资源消耗;其次,就算是这10ms级的差距,在高并发系统中也是很有用的。我们用它好处多多。

单例模式就这么多了,下次再讲其他设计模式,有什么不对的地方还望留言或者邮件指出,感激不尽!

send Me~

PHP设计模式(一)的更多相关文章

  1. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. java EE设计模式简介

    1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...

  3. 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式

    上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...

  4. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  5. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  6. 设计模式之行为类模式大PK

                                        行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...

  7. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  8. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  9. java 设计模式

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...

  10. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

随机推荐

  1. JAVA JPA - 示例用法

    JPA(Java Persistence API)是JSR(Java Specification Requests)的一部分,定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate. ...

  2. 我在 CSDN 的小窝

    以后有文章,我会同时更新 博客园 和 CSDN. CSDN:http://blog.csdn.net/u010918003

  3. Android开发:在EditText中关闭软键盘 转来的

    1.EditText有焦点(focusable为true)阻止输入法弹出 editText=(EditText)findViewById(R.id.txtBody); editText.setOnTo ...

  4. GWT-Dev-Plugin(即google web toolkit developer plugin)for Chrome的安装方法

    如果你想要在Chrome中进行GWT调试,需要安装“gwt developer plugin for chrome”,但是普通安装模式下,会提示: This application is not su ...

  5. How to build windows azure PowerShell Source Code

    Download any version source code of Windows Azure Powershell from https://github.com/Azure/azure-sdk ...

  6. js前端的各种面试题

    转载:http://bbs.blueidea.com/thread-3107428-1-1.html 1.截取字符串abcdefg的efg //alert('abcdefg'.substring(4) ...

  7. 维克里拍卖 Vickrey auction

    https://en.wikipedia.org/wiki/Vickrey_auction 维克里拍卖(Vickrey auction),即次价密封投标拍卖(Second-price sealed-b ...

  8. matlab 功率谱分析

    matlab 功率谱分析 1.直接法:直接法又称周期图法,它是把随机序列x(n)的N个观测数据视为一能量有限的序列,直接计算x(n)的离散傅立叶变换,得X(k),然后再取其幅值的平方,并除以N,作为序 ...

  9. 献给那些每次调试时都要启动很多WEB项目的苦逼程序猿

    当一个解决方案包含多个WEB项目的时候,只要按F5调试,其它用不着的WEB项目也会自动添加到托盘里.很多新手都不知道如何解决这个问题,我也是刚知道. 在网上找了很多资料看到有2种解决方法: 1.把WE ...

  10. MySQL删除/更新数据时报1175错误

    今天删除MySQL数据库中的一条记录的时候,一直不能删除,提示错误信息如下: Error Code: 1175. You are using safe update mode and you trie ...