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 相关文章推荐
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
Sep 30 PHP
php Notice: Undefined index 错误提示解决方法
Aug 29 PHP
php 抽象类的简单应用
Sep 06 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
Jun 08 PHP
php empty()与isset()区别的详细介绍
Jun 17 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
Jun 24 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
Aug 15 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
May 16 PHP
PHP 中TP5 Request 请求对象的实例详解
Jul 31 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
May 06 PHP
在 Laravel 项目中使用 webpack-encore的方法
Jul 21 PHP
关于laravel-admin ueditor 集成并解决刷新的问题
Oct 21 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
Protoss建筑一览
2020/03/14 星际争霸
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
PHP中的switch语句的用法实例详解
2015/10/21 PHP
Fleaphp常见函数功能与用法示例
2016/11/15 PHP
由document.body和document.documentElement想到的
2009/04/13 Javascript
var与Javascript变量隐式声明
2009/09/17 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
浅析JavaScript中的CSS属性及命名规范
2013/11/28 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
javascript 闭包详解
2015/02/15 Javascript
javascript实现表单提交后,提交按钮不可用的方法
2015/04/18 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
vue实现移动端轻量日期组件不依赖第三方库的方法
2019/04/28 Javascript
微信小程序下拉菜单效果的实例代码
2019/05/14 Javascript
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
说一说Python logging
2016/04/15 Python
python创建列表和向列表添加元素的实现方法
2017/12/25 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
python实现在图片上画特定大小角度矩形框
2018/10/24 Python
python 使用pandas计算累积求和的方法
2019/02/08 Python
python ---lambda匿名函数介绍
2019/03/13 Python
简单了解如何封装自己的Python包
2020/07/08 Python
CSS3点击按钮实现背景渐变动画效果
2016/10/19 HTML / CSS
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
文秘大学生求职信
2014/02/25 职场文书
霸气队列口号
2014/06/18 职场文书
2014年9.18纪念日演讲稿
2014/09/14 职场文书
北大自主招生自荐信
2015/03/04 职场文书
2015年保险公司工作总结
2015/04/24 职场文书
2015年路政工作总结
2015/05/22 职场文书
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android