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面向对象全攻略 (七) 继承性
Sep 30 PHP
通过具体程序来理解PHP里面的抽象类
Jan 28 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
Dec 16 PHP
解析php dirname()与__FILE__常量的应用
Jun 24 PHP
PHP队列用法实例
Nov 05 PHP
基于laravel制作APP接口(API)
Mar 15 PHP
深入浅出讲解:php的socket通信原理
Dec 03 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
Feb 04 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
Apr 18 PHP
PHP基于socket实现客户端和服务端通讯功能
Jul 13 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 PHP
PHP 实现 WebSocket 协议原理与应用详解
Apr 22 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
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
2007/04/18 PHP
php adodb分页实现代码
2009/03/19 PHP
PHP批量检测并去除文件BOM头代码实例
2014/05/08 PHP
php中的mongodb select常用操作代码示例
2014/09/06 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
ajaxControlToolkit AutoCompleteExtender的用法
2008/10/30 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
2017/04/24 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
微信小程序淘宝首页双排图片布局排版代码(推荐)
2020/10/29 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
Python实现处理管道的方法
2015/06/04 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
Sanic框架请求与响应实例分析
2018/07/16 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
中国第一家杂志折扣订阅网:杂志铺
2016/08/30 全球购物
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
VC++笔试题
2014/10/13 面试题
采购员岗位职责
2013/11/15 职场文书
有关打架的检讨书
2014/01/25 职场文书
小学生综合素质评语
2014/04/23 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
小学四年级作文之最感动的一件事
2019/11/01 职场文书
Java 超详细讲解hashCode方法
2022/04/07 Java/Android