本篇介绍一下PHP中的单例模式特点及实例。

什么是单例

单例模式,主要是保证在面向对象编程设计中,一个类只能有一个实例对象存在(即仅实例化一次)。

单例的优点

  1. PHP的每次请求访问都是一次独立的进程,比如为了执行多个SQL语句,只实例化一次数据库连接就足够了,可以提高效率
  2. 使用单例模式可以避免大量的new操作,减少对资源的消耗,节省内存

单例的应用场景

  1. 建立目录
  2. 数据库连接及操作
  3. 系统日志

单例的实现方法

所有的单例模式都至少拥有以下3种公共元素:

  1. 拥有一个构造函数,并且必须被标记为private
  2. 拥有一个保存类的实例的静态成员变量
  3. 拥有一个访问这个实例的公共静态方法,用于创建或获取它本身的静态私有对象

单例的例子

第一种:

<?php
/**
 * PHP单例类
 */
class Singleton {
    /**
     * 私有静态变量,保存全局实例
     */
    private static  $_instance = null;
 
    /**
     * 私有化默认构造方法,保证外界无法直接实例化,只能内部使用new去创建对象
     */
    private function __construct() {
        // 可以在此处实现一些数据库连接等操作
    }
 
    /**
     * 静态工厂方法,返回此类的唯一实例
     */
    public static function getInstance() {
        if (is_null(self::$_instance)) {
            self::$_instance = new self();  // 实例化本类对象
        }
 
        return self::$_instance;
    }
 
    /**
     * 防止用户克隆实例
     */
    public function __clone(){
        die('Clone is not allowed.' . E_USER_ERROR);
    }
 
    /**
     * 测试用方法
     */
    public function test() {
        echo 'Singleton Test!';
    }
 
}
 
/**
 * 客户端
 */
class Client {
    public static function main() {
        $instance = Singleton::getInstance();
        $instance->test();
    }
}
 
Client::main();

第二种:

static function getInstance($class, $param = array())
{
    if (!isset($obj[$class])) {
	$obj[$class] = new $class($param);
    }
    
	return $obj[$class];
}