服务报价 | 域名主机 | 网络营销 | 软件工具| [加入收藏]
 热线电话: #
当前位置: 主页 > php教程 > php教程 >

php设计模式实例之单例模式

时间:2016-03-30 09:30来源: 作者: 点击:
本文章来给大家介绍php设计模式实例之单例模式方法,有需要了解的朋友可进入参考参考. 单例类: 1.构造函数需要标记为private,单例类不能再其他类中实例化,只能被其自身实例化 2.拥有一
给大家介绍php设计模式实例之单例模式方法,有需要了解的朋友可进入参考参考.
 
单例类:
 
1.构造函数需要标记为private,单例类不能再其他类中实例化,只能被其自身实例化
 
2.拥有一个保存类的实例静态成员变量
 
3.拥有一个访问这个实例的公共的静态方法.[常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到此类是否已经被实例化]
 
注:需要创建__clone()方法防治对象被复制
 
作用:
 
1.php的应用主要用于数据库,所以一个应用中会存在大量的数据库操作,使用单例模式,则可以避免大量new操作消耗的资源
 
2.如果系统中需要一个类来全局控制某些配置信息,那么使用单例模式可以很方便的实现.参照ZF的FrontController部分
 
3.在一个页面请求汇总,便于进行调试,因为所有的代码都集中在一个类中,我们可以在类中设置钩子,输出日志,从而避免到处var_dump,echo.
 
php单例模式的例子.
 
实例代码如下:
 
<?php 
/** 
 * 单例模式 
*/ 
class DanLi{ 
    //静态成员变量 
    private static $_instance; 
    //私有的构造方法 
    private function __construct(){ 
    } 
    //防止对象被克隆 
    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 "ok"; 
    } 
   
//错误:$danli = new DanLi(); $danli_clone = clone $danli; 
//正确:$danli = DanLi::getInstance(); $danli->test(); 
?> 
下面我们讨论下为什么要使用PHP单例模式?
 
多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种"计划生育".   而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位失望. 但是单例仅仅只有这个功能和应用吗? 答案是否定的,我们一起来看看.
 
1. php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源.
 
2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分.
 
3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo.
 
实例代码如下:
 
<?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; 
?> 
(责任编辑:最模板)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
热点内容