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 相关文章推荐
PHP日期时间函数的高级应用技巧
May 16 PHP
PHP5 字符串处理函数大全
Mar 23 PHP
PHP 一个比较完善的简单文件上传
Mar 25 PHP
PHP 加密解密内部算法
Apr 22 PHP
php表单提交问题的解决方法
Apr 12 PHP
php并发对MYSQL造成压力的解决方法
Feb 21 PHP
解析PHP实现下载文件的两种方法
Jul 05 PHP
PHP zip扩展Linux下安装过程分享
May 05 PHP
php绘制一条直线的方法
Jan 24 PHP
基于php的微信公众平台开发入门实例
Apr 15 PHP
discuz图片顺序混乱解决方案
Jul 29 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 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
PHP的历史和优缺点
2006/10/09 PHP
PHP 登录记住密码实现思路
2013/05/07 PHP
PHP 导出Excel示例分享
2014/08/18 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
jQuery Jcrop插件实现图片选取功能
2011/11/23 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
JavaScript插件化开发教程 (二)
2015/01/27 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
利用JQuery阻止事件冒泡
2016/12/01 Javascript
PHP+jquery+ajax实现分页
2016/12/09 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
vue下拉列表功能实例代码
2018/04/08 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
javascript实现点击按钮切换轮播图功能
2020/09/23 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
[02:02]特效爆炸!DOTA2珍宝之瓶待你开启
2018/08/21 DOTA
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
[02:19]2018年度DOTA2最佳核心位选手-完美盛典
2018/12/17 DOTA
[10:21]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster 选手采访
2021/03/11 DOTA
python正则表达式爬取猫眼电影top100
2018/02/24 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
全面解析HTML5中的标准属性与自定义属性
2016/02/18 HTML / CSS
家庭教育先进个人事迹材料
2014/01/24 职场文书
《学棋》教后反思
2014/04/14 职场文书
群众路线教育查摆剖析材料
2014/10/10 职场文书
四风问题党员个人整改措施
2014/10/27 职场文书
女方离婚起诉书
2015/05/18 职场文书
学校安全管理制度
2015/08/06 职场文书