为什么80%的码农都做不了架构师?>>>   

参考:

http://www.douban.com/group/topic/47722220/

http://www.thinkphp.cn/topic/4496.html

为什么要使用PHP单例模式?

1、PHP的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。

2、如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分。

3、在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。

<?php
header("Content-Type: text/html; charset=UTF-8");
class Singleton{
//保存类的实例
private static $_instance;

private function __construct(){
echo "This is a Constructed method;";
}

//防止对象被克隆
public function __clone(){
trigger_error('Clone is not allow !',E_USER_ERROR);
}

public static function getInstance(){
if(!(self::$_instance instanceof self)){
self::$_instance=new self;
}
return self::$_instance;
}
public function test(){
echo '调用方法成功';
}
}

//正确的调用方法
$singleton = Singleton::getInstance();
$singleton->test();

$singleton_clone = clone $singleton;
?>

本文介绍了为何使用PHP单例模式,希望本文对读者有所帮助,感谢阅读本文。更多有关php技术问题欢迎加群探讨:304224365 ,验证码:db,定期分享源码视频哦~

----------------------------------------------------------------------------------------------------

首先我们要知道明确单例模式这个概念,那么什么是单例模式呢?

单例模式顾名思义,就是只有一个实例。

作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,

这个类我们称之为单例类。

单例模式的要点有三个:

一是某个类只能有一个实例;

二是它必须自行创建这个实例;

三是它必须自行向整个系统提供这个实例。

下面我们讨论下为什么要使用PHP单例模式?

多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种"计划生育". 而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位失望. 但是单例仅仅只有这个功能和应用吗? 答案是否定的,我们一起来看看。

1. php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源。

2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分。

3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。

* 单例模式举例,其要点如下:
*
* 1. $_instance 必须声明为静态的私有变量
* 2. 构造函数和克隆函数必须声明为私有的,这是为了防止外部程序new 类从而失去单例模式的意义
* 3. getInstance()方法必须声明为公有的,必须调用此方法以返回唯一实例的一个引用
* 4. ::操作符只能访问静态变量或静态函数
* 5. PHP的单例模式是相对而言的,因为PHP的解释运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。
* 也就是说,PHP在语言级别上没有办法让某个对象常驻内存。在PHP中,所有的变量都是页面级的,无论是全局变量,
* 还是类的静态成员,都会在页面执行完毕后被清空,结果会重新建立新的对象,这样也就完全失去了Singleton的意义。
* 不过,在实际应用中同一个页面中可能会存在多个业务逻辑,这时单例模式就起到了很重要的作用,有效的避免了重复
* new 对象(注: new 对象会消耗内存资源)这么一个行为,所以我们说PHP的单例模式是相对而言的

转载于:https://my.oschina.net/ecnu/blog/288018

PHP为什么以及什么时候使用单例模式?相关推荐

  1. Java单例模式个人总结(实例变量和类变量)

    Java单例模式 背景知识:Static关键字. 在对于定义类的变量,分为两种,是否具有static修饰的变量: 没有static修饰的变量,通过类的实例化(对象)引用,改变量称为实例变量: 使用st ...

  2. GOF23设计模式(创建型模式)单例模式

    目录: 一:单例模式的核心作用.常见应用场景 二:五种单例模式及其实现 三:关于反射和反序列化破解单例模式的漏洞,以及相应的解决方案 四:测试五种单例模式的效率 一:核心作用及常见应用场景: 核心作用 ...

  3. Java设计模式:单例模式

    学而时习,稳固而之心, 好久没有复习java的知识了,今天有空温习了单例模式,这里记录一下 单例模式是常见的设计模式的一种,其特点就是 指一个类只有一个实例,且该类能自行创建这个实例  , 保证一个类 ...

  4. [Python设计模式] 第21章 计划生育——单例模式

    github地址:https://github.com/cheesezh/python_design_patterns 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式 ...

  5. Python 精选笔试面试习题—sorted 与 sort 单例模式、统计字符个数Count、垃圾回收、lambda函数、静态方法、类方法、实例方法、分布式锁、

    1. 字典根据键从小到大排序? In[38]: dic = {"name": "Tom", "age": 30, "country ...

  6. 单例模式的两种实现方式对比:DCL (double check idiom)双重检查 和 lazy initialization holder class(静态内部类)...

    首先这两种方式都是延迟初始化机制,就是当要用到的时候再去初始化. 但是Effective Java书中说过:除非绝对必要,否则就不要这么做. 1. DCL (double checked lockin ...

  7. 基础设计模式:单例模式+工厂模式+注册树模式

    单例模式: 通过提供自身共享实例的访问,单例设计模式用于限制特定对象只能被创建一次. 使用场景: 一般数据库实例都会用单例模式 实现: 单例设计模式就是要一个类只能实例化一个对象. 要想让一个类只能实 ...

  8. 设计模式——单例模式(Singleton)

    保证一个类仅有一个实例,并提供一个访问它的全局访问点.--DP UML类图 模式说明 个人认为单例模式是所有设计模式中最为简单的一个模式,因为实现这个模式仅需一个类,而不像其他模式需要若干个类.这个模 ...

  9. 设计模式 之美 -- 单例模式

    为什么要使用单例? 一个类只允许创建一个对象或者实例. 背景简介:使用多线程并发访问同一个类,为了保证类的线程安全,可以有两种方法: 将该类定义为单例模式,即该类仅允许创建一个实例 为该类的成员函数添 ...

  10. 【C++】C/C++ 中的单例模式

    目录 part 0:单例模式3种经典的实现方式 Meyer's Singleton Meyers Singleton版本二 Lazy Singleton Eager Singleton Testing ...

最新文章

  1. 微擎url模式解读_微擎开发文档之微擎执行主流程介绍
  2. SQLite自增关键字报错(near “AUTO_INCREMENT“: syntax error)
  3. html tab选项卡 控件,tab选项卡插件
  4. 在C#代码中应用Log4Net 中配置文件的解释
  5. vs2005之主题与皮肤的学习
  6. php开发支付宝支付密码忘记了怎么办_密码箱忘记密码怎么办?密码箱解锁方法大全...
  7. 浅析C#的事件处理和自定义事件
  8. Reverse原理背后的数学和魔幻艺术
  9. 洛谷 2449 [SDOI2005]矩形
  10. Quartz.Net 学习随手记之03 配置文件
  11. ios+测试版软件,ios15测试版描述文件
  12. 昆仑通态屏幕制作(连载1)---接触篇
  13. 手把手教你破解软件,每一步都有图示,你若再不会就太XX
  14. 多个excel表格数据汇总均值
  15. 操作系统-课堂笔记-进程概述(南航)
  16. linux终端串口调试(RS232 serial ttyS)
  17. 图片转文字怎么转换?分享你个简单的方法
  18. 从技术宝库到云上机遇:华为云开天aPaaS的“修路记”
  19. 月薪超1.6万美元!对冲基金实习生也内卷
  20. oracle pl/sql level妙用

热门文章

  1. ast java_Java代码分析器(一): JDT入门
  2. vs点击方法跳不到对于的地方_NBA总决赛G4直播:湖人vs热火,热火继续针对浓眉,能否扳平比分?...
  3. android点击通知跳转到服务,Android 接收推送消息跳转到指定页面的方法
  4. 余弦信号频谱表达式_2019年清华828信号与系统试题回忆
  5. couchdb java 连接_CouchDB客户端连接的说明---Java版
  6. oracle错误代码12516,ORA-12516错误解决
  7. matlab中antoine方程应用,Antoine方程 安托因方程
  8. 计算机动漫游戏制作 巴中,四川省哪些中专学校有计算机动漫与游戏制作专业...
  9. Nginx添加ngx_http_headers_module模块
  10. js发送get、post请求的方法简介