Heim  >  Artikel  >  php教程  >  php设计模式实例之单例模式

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

WBOY
WBOYOriginal
2016-05-25 16:48:151018Durchsuche

本文章来给大家介绍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(&#39;Clone is not allow!&#39;, 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 &#39;I am Construceted&#39;;
    }
    //单例方法
    public static function singleton() {
        if (!isset(self::$_instance)) {
            $c = __CLASS__;
            self::$_instance = new $c;
        }
        return self::$_instance;
    }
    //阻止用户复制对象实例
    public function __clone() {
        trigger_error(&#39;Clone is not allow&#39;, E_USER_ERROR);
    }
    function test() {
        echo ("test");
    }
}
// 这个写法会出错,因为构造方法被声明为private
$test = new Example;
// 下面将得到Example类的单例对象
$test = Example::singleton();
$test->test();
// 复制对象将导致一个E_USER_ERROR.
$test_clone = clone $test;
?>


文章地址:

转载随意^^请带上本文地址!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn