PHP中常用的三种设计模式详解【单例模式、工厂

本文实例讲述了PHP中常用的三种设计模式。分享给大家供大家参考,具体如下:

PHP中常用的三种设计模式:单例模式、工厂模式、观察者模式

1.单例模式

为何要使用PHP单例模式?

多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种”计划生育”. 而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位失望. 但是单例仅仅只有这个功能和应用吗? 答案是否定的。

  1. php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源。
  2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分。
  3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。

一个单例类应包括以下几点:

和普通类不同,单例类不能被直接实例化,只能是由自身实例化。因此,要获得这样的限制效果,构造函数必须标记为private

要让单例类不被直接实例化而能起到作用,就必须为其提供这样的一个实例。因此,就必须要让单例类拥有一个能保存类的实例的私有静态成员变量和对应的一个能访问到实例的公共静态方法。

在PHP中,为防止对单例类对象的克隆来打破单例类的上述实现形式,通常还为其提供一个空的私有__clone()方法。

对于一个类的对象,如果使用“clone运算符”,就会复制出一个和当前对象完全一样的新对象出来,并且,此时还会自动调用该类的魔术方法:__clone()(只要该类中有该方法)。

则要实现单例类,就应该对这个单例类的对象“禁止克隆”,用private来修饰__clone()来实现禁止克隆,具体可参考单例类的加强:禁止克隆。

单例模式的例子:

<?php
/**
* 设计模式之单例模式
* $instance必须声明为静态的私有变量
* 构造函数和析构函数必须声明为私有,防止外部程序new
* 类从而失去单例模式的意义
* getInstance()方法必须设置为公有的,必须调用此方法
* 以返回实例的一个引用
* ::操作符只能访问静态变量和静态函数
* new对象都会消耗内存
* 使用场景:最常用的地方是数据库连接。
* 使用单例模式生成一个对象后,
* 该对象可以被其它众多对象所使用。
*/
class SingetonBasic {
private static $instance; //静态变量要私有化,防止类外修改
// other vars..
private function __construct() {  //构造函数私有化,类外不能直接新建对象
  // do construct..
}
private function __clone() {}  //在__clone()前用private修饰,用来禁止克隆
public static function getInstance() { //公共的静态方法,public——外部的接口,static——不使用对象而是通过类名访问
  if (!(self::$instance instanceof self)) { //私有静态变量$instance为空
    self::$instance = new self(); //新建为自身的对象,并赋值给私有变量$instance
  }
  return self::$instance; //返回私有变量$instance
}
// other functions..
}
$a = SingetonBasic::getInstance();
$b = SingetonBasic::getInstance();
var_dump($a === $b);  //结果为:boolean true
//?>


      

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5538.html