php单例模式的简单实现方法


Posted in PHP onJune 10, 2016

php单例模式的简单实现方法

<?php 
 
/** 
* 设计模式之单例模式 
* $_instance必须声明为静态的私有变量 
* 构造函数和析构函数必须声明为私有,防止外部程序new 
* 类从而失去单例模式的意义 
* getInstance()方法必须设置为公有的,必须调用此方法 
* 以返回实例的一个引用 
* ::操作符只能访问静态变量和静态函数 
* new对象都会消耗内存 
* 使用场景:最常用的地方是数据库连接。 
* 使用单例模式生成一个对象后, 
* 该对象可以被其它众多对象所使用。 
*/
class Example 
{ 
//保存例实例在此属性中 
private static $_instance; 
 
//构造函数声明为private,防止直接创建对象 
private function __construct() 
{ 
echo 'I am Construceted'; 
} 
 
//单例方法 
public static function singleton() 
{ 
if(!isset(self::$_instance)) 
{ 
$c=__CLASS__; 
self::$_instance=new $c; 
} 
return self::$_instance; 
} 
 
//阻止用户复制对象实例 
public function __clone() 
{ 
trigger_error('Clone is not allow' ,E_USER_ERROR); 
} 
 
function test() 
{ 
echo("test"); 
 
} 
} 
 
// 这个写法会出错,因为构造方法被声明为private 
$test = new Example; 
 
// 下面将得到Example类的单例对象 
$test = Example::singleton(); 
$test->test(); 
 
// 复制对象将导致一个E_USER_ERROR. 
$test_clone = clone $test; 
?>

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

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

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

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

单例模式的要点有三个:

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

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

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

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

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

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

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

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

以上这篇php单例模式的简单实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
一个多文件上传的例子(原创)
Oct 09 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
Nov 07 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
Jun 27 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
Feb 12 PHP
php通过array_push()函数添加多个变量到数组末尾的方法
Mar 18 PHP
PHP使用递归生成文章树
Apr 21 PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 PHP
浅谈PHP中关于foreach使用引用变量的坑
Nov 14 PHP
Yii2框架可逆加密简单实现方法
Aug 25 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
php 使用 __call实现重载功能示例
Nov 18 PHP
PHP操作mysql数据库分表的方法
Jun 09 #PHP
浅谈PHP链表数据结构(单链表)
Jun 08 #PHP
PHP Yaf框架的简单安装使用教程(推荐)
Jun 08 #PHP
WordPress分页伪静态加html后缀
Jun 08 #PHP
php 流程控制switch的简单实例
Jun 07 #PHP
php 使用curl模拟登录人人(校内)网的简单实例
Jun 06 #PHP
PHP session 会话处理函数
Jun 06 #PHP
You might like
PHP4与PHP3中一个不兼容问题的解决方法
2006/10/09 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
preg_match_all使用心得分享
2014/01/31 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
javascript 单选框,多选框美化代码
2008/08/01 Javascript
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
基于jquery的tab切换 js原理
2010/04/01 Javascript
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
为何人工智能(AI)首选Python?读完这篇文章你就知道了(推荐)
2019/04/06 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
Python中url标签使用知识点总结
2020/01/16 Python
Python实现新型冠状病毒传播模型及预测代码实例
2020/02/05 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
2020/05/22 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
Python实现快速大文件比较代码解析
2020/09/04 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
2020/12/31 Python
体验完美剃须:The Art of Shaving
2018/08/06 全球购物
编程用JAVA解析XML的方式
2013/07/07 面试题
办公室内勤岗位职责范本
2013/12/09 职场文书
《骆驼和羊》教学反思
2014/02/27 职场文书
体育之星事迹材料
2014/05/11 职场文书
竞争上岗演讲稿范文
2014/05/12 职场文书
群众路线查摆问题整改措施
2014/10/10 职场文书
老人再婚离婚协议书范本
2014/10/27 职场文书
职称评定个人总结
2015/03/05 职场文书
入党介绍人考察意见
2015/06/01 职场文书
Python包argparse模块常用方法
2021/06/04 Python
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android