在码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. ACM水题

    ACM小白...非常费劲儿的学习中,我觉得目前我能做出来的都可以划分在水题的范围中...不断做,不断总结,随时更新 POJ: 1004 Financial Management 求平均值 杭电OJ: ...

  2. redis 学习笔记(2)-client端示例代码

    redis提供了几乎所有主流语言的client,java中主要使用二种:Jedis与Redisson 一.Jedis的使用 <dependency> <groupId>redi ...

  3. 我理解的Hanlder--android消息传递机制

    每一个学习Android的同学都会觉得Handler是一个神奇的东西,我也一样,开始我以为我懂了Handler的机制,后来发现自己是一知半解,昨天想想,我能否自己实现一个Handler,让子线程与Ac ...

  4. ASP.NET MVC3入门教程之第一个WEB应用程序

    本文转载自:http://www.youarebug.com/forum.php?mod=viewthread&tid=91&extra=page%3D1 上一节,我们已经搭建好了AS ...

  5. web性能优化——浏览器相关

    简介 优化是一个持续的过程.所以尽可能的不要有人为的参与.所以能自动化的或者能从架构.框架级别解决的就最更高级别解决. 这样即能实现面对开发人员是透明的.不响应,又能确保所有资源都是被优化过的. 场景 ...

  6. Pearson(皮尔逊)相关系数及MATLAB实现

    转自:http://blog.csdn.net/wsywl/article/details/5727327 由于使用的统计相关系数比较频繁,所以这里就利用几篇文章简单介绍一下这些系数. 相关系数:考察 ...

  7. Nginx的配置文件

    #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...

  8. thinkphp 配置多数据库

    1配置文件中配置另一数据库连接信息 例如: 'TestModelConfig' => array( //'配置项'=>'配置值' 'DB_TYPE' => 'mysql', // 数 ...

  9. mysql创建触发器

    触发器语句只有一句话 可以省略begin和end CREATE trigger `do_praise` after insert on praise for each row update post ...

  10. Centos|Rhel搭建vsftp

    vsftp,在ftp传输中相对安全的 01.安装vsftpd yum install -y vsftpd 版本信息: Installed PackagesName        : vsftpdArc ...