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脚本的10个技巧(5)
Oct 09 PHP
WIN98下Apache1.3.14+PHP4.0.4的安装
Oct 09 PHP
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
Mar 28 PHP
php 过滤器实现代码
Aug 09 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
Aug 23 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
SESSION存放在数据库用法实例
Aug 08 PHP
深入理解PHP 数组之count 函数
Jun 13 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
PHP实现的多进程控制demo示例
Jul 22 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
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
在jQuery1.5中使用deferred对象 着放大镜看Promise
2011/03/12 Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
2013/01/24 Javascript
jquery图片不完全按比例自动缩小的简单代码
2013/07/29 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
jquery自定义插件——window的实现【示例代码】
2016/05/06 Javascript
Ionic快速安装教程
2016/06/03 Javascript
详解Angualr 组件间通信
2017/01/21 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
es6学习笔记之Async函数的使用示例
2017/05/11 Javascript
微信小程序movable view移动图片和双指缩放实例代码
2017/08/08 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
JS使用setInterval实现的简单计时器功能示例
2018/04/19 Javascript
利用JS实现一个同Excel表现的智能填充算法
2018/08/13 Javascript
vue同步父子组件和异步父子组件的生命周期顺序问题
2018/10/07 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
2019/03/28 Javascript
python操作gmail实例
2015/01/14 Python
python处理二进制数据的方法
2015/06/03 Python
selenium python浏览器多窗口处理代码示例
2018/01/15 Python
Python 查找list中的某个元素的所有的下标方法
2018/06/27 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
2018/12/18 Python
Django的性能优化实现解析
2019/07/30 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
python 伯努利分布详解
2020/02/25 Python
Selenium常见异常解析及解决方案示范
2020/04/10 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
Python如何定义一个函数
2015/09/01 面试题
客户经理岗位职责
2015/01/31 职场文书
个人催款函范文
2015/06/24 职场文书
公安干警正风肃纪心得体会
2016/01/15 职场文书
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python