php面向对象值单例模式


Posted in PHP onMay 03, 2016
单例模式(职责模式):
简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务;
单例类:
1、构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化;
2、拥有一个保存类的实例的静态成员变量
3、拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)
另外,需要创建__clone()方法防止对象被复制(克隆)
为什么要使用PHP单例模式?
1、php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。
2、如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分。
3、在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。
代码实现:
<111?111php111
/1**
* 设计模式之单例模式
* $_instance必须声明为静态的私有变量
* 构造函数和析构函数必须声明为私有,防止外部程序new
* 类从而失去单例模式的意义
* getInstance()方法必须设置为公有的,必须调用此方法
* 以返回实例的一个引用
* ::操作符只能访问静态变量和静态函数
* new对象都会消耗内存
* 使用场景:最常用的地方是数据库连接。 
* 使用单例模式生成一个对象后,
* 该对象可以被其它众多对象所使用。 
*/
class Danli {
 
//保存类实例的静态成员变量
private static $_instance;
 
//private标记的构造方法
private function __construct(){
echo 'This is a Constructed method;';
}
 
//创建__clone方法防止对象被复制克隆
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 '调用方法成功';
}
 
}
 
//用new实例化private标记构造函数的类会报错
//$danli = new Danli();
 
//正确方法,用双冒号::操作符访问静态方法获取实例
$danli = Danli::getInstance();
$danli->test();
 
//复制(克隆)对象将导致一个E_USER_ERROR
$danli_clone = clone $danli;
PHP 相关文章推荐
提问的智慧
Oct 09 PHP
如何使用PHP往windows中添加用户
Dec 06 PHP
PHP 文件上传功能实现代码
Jun 24 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
Jan 17 PHP
laravel安装和配置教程
Oct 29 PHP
php 魔术方法详解
Nov 11 PHP
php简单生成随机数的方法
Jul 30 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
Jan 05 PHP
PHP实现的随机红包算法示例
Aug 14 PHP
PHP开发之用微信远程遥控服务器
Jan 25 PHP
PHP赋值的内部是如何跑的详解
Jan 13 PHP
PHP判断是否是json字符串
Apr 01 PHP
php使用ffmpeg获取视频信息并截图的实现方法
May 03 #PHP
Linux环境下php实现给网站截图的方法
May 03 #PHP
PHPExcel笔记, mpdf导出
May 03 #PHP
PHP实现的进度条效果详解
May 03 #PHP
php实现按天数、星期、月份查询的搜索框
May 02 #PHP
php支持断点续传、分块下载的类
May 02 #PHP
php数组分页实现方法
Apr 30 #PHP
You might like
PHP 日,周,月点击排行统计
2012/01/11 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
jquery插件之easing使用
2010/08/19 Javascript
基于jquery的3d效果实现代码
2011/03/23 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
详解JavaScript中shift()方法的使用
2015/06/09 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
JS两个数组比较,删除重复值的巧妙方法(推荐)
2016/06/03 Javascript
用jquery快速解决IE输入框不能输入的问题
2016/10/04 Javascript
jQuery使用bind函数实现绑定多个事件的方法
2017/10/11 jQuery
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
JavaScript实现浏览器网页自动滚动并点击的示例代码
2020/12/05 Javascript
Python中用format函数格式化字符串的用法
2015/04/08 Python
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
多个应用共存的Django配置方法
2018/05/30 Python
Python代码太长换行的实现
2019/07/05 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
Pycharm的Available Packages为空的解决方法
2020/09/18 Python
检测浏览器是否支持html5视频的代码
2013/03/28 HTML / CSS
加热夹克:RAVEAN
2018/10/19 全球购物
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
求职信的最佳写作思路
2014/02/01 职场文书
授权委托书怎么写
2014/04/03 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
企业形象策划方案
2014/05/29 职场文书
高考励志标语
2014/06/05 职场文书
经典团队口号大全
2014/06/21 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
办公室文员岗位职责
2015/02/04 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
MySQL Shell import_table数据导入的实现
2021/08/07 MySQL