设计模式之单例模式 PHP版

PHP 林涛 5702℃ 0评论

设计模式中的单例模式核心在“单”上。即:一个对象只负责一个任务。

优点:

·单例模能减少new操作消耗资源 ·很方便的实现单文件控制,如载入配置文件;· 在一个页面请求中便于调试;

缺点:

PHP的所有变量都是页面级的,每次页面执行时会重新建立新的对象,页面执行完毕后会被清空;所以单例模式只针对单次页面请求时有多个应用场景并需要共享同一对象资源时候有意义。

要点:

· 构造函数需要设置为private(做到访问控制,防止外部代码用new来创建对象),单例类只能被自身实例化,不能被外部代码实例化,所以用private屏蔽外来代码;

private function __construct()
   {
        $this->_db = pg_connect(‘xxxx’);
    }

· 要拥有一个静态成员变量,用来保存实例化后的类;

private static $_instance;  

· 要拥有一个公共的静态方法,用来访问这个实例(一般情况会用getInstance()方法进行实例化,通过instanceof操作符可以检测到类是否已经被实例化)

    public static function getInstance()
    {
        if(! (self::$_instance instanceof self) )
        {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

· 需要创建__clone()方法防止对象被复制(用来覆盖__clone 方法,从而做到防止被克隆)

private function __clone()
    {
    }

 

引用实例:

<?php

/1**

设计模式之单例模式

$_instance必须声明为静态的私有变量

构造函数和析构函数必须声明为私有,防止外部程序new

类从而失去单例模式的意义

getInstance()方法必须设置为公有的,必须调用此方法

以返回实例的一个引用

::操作符只能访问静态变量和静态函数

new对象都会消耗内存

使用场景:最常用的地方是数据库连接。 

使用单例模式生成一个对象后,

该对象可以被其它众多对象所使用。 

*/

class Danli {

//保存类实例的静态成员变量

private static $_instance;

//private标记的构造方法

private function __construct(){

echo ‘This is 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;

如需转载请注明: 转载自26点的博客

本文链接地址: 设计模式之单例模式 PHP版

转载请注明:26点的博客 » 设计模式之单例模式 PHP版

喜欢 (0)
发表我的评论
取消评论

表情
(1)个小伙伴在吐槽
  1. 以U哦加厚