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之第六天
Oct 09 PHP
一个简单实现多条件查询的例子
Oct 09 PHP
php框架Phpbean说明
Jan 10 PHP
PHP extract 将数组拆分成多个变量的函数
Jun 30 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
WordPress判断用户是否登录的代码
Mar 17 PHP
使用PHP遍历文件夹与子目录的函数代码
Sep 26 PHP
PHP延迟静态绑定示例分享
Jun 22 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
Jul 18 PHP
PHP简单获取视频预览图的方法
Mar 12 PHP
php正则替换处理HTML页面的方法
Jun 17 PHP
详解php与ethereum客户端交互
Apr 28 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
留言板翻页的实现详解
2006/10/09 PHP
解决163/sohu/sina不能够收到PHP MAIL函数发出邮件的问题
2009/03/13 PHP
PHP输出XML到页面的3种方法详解
2013/06/06 PHP
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
php实现获取文章内容第一张图片的方法
2014/11/04 PHP
php获取网页上所有链接的方法
2015/04/03 PHP
php对象和数组相互转换的方法
2015/05/12 PHP
基于jquery的代码显示区域自动拉长效果
2011/12/07 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
HTTP 304错误的详细讲解
2013/11/13 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
JS中script标签defer和async属性的区别详解
2016/08/12 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
vue.js评论发布信息可插入QQ表情功能
2017/08/08 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
python处理中文编码和判断编码示例
2014/02/26 Python
使用Python编写vim插件的简单示例
2015/04/17 Python
Python 登录网站详解及实例
2017/04/11 Python
Python logging管理不同级别log打印和存储实例
2018/01/19 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
CSS3中Animation动画属性用法详解
2016/07/04 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
技校生自我鉴定范文
2013/09/26 职场文书
售后服务经理岗位职责
2014/02/25 职场文书
法院个人总结
2015/03/03 职场文书
JavaWeb 入门:Hello Servlet
2021/07/16 Java/Android