本篇介绍一下PHP中的单例模式特点及实例。
什么是单例
单例模式,主要是保证在面向对象编程设计中,一个类只能有一个实例对象存在(即仅实例化一次)。
单例的优点
- PHP的每次请求访问都是一次独立的进程,比如为了执行多个SQL语句,只实例化一次数据库连接就足够了,可以提高效率
- 使用单例模式可以避免大量的new操作,减少对资源的消耗,节省内存
单例的应用场景
- 建立目录
- 数据库连接及操作
- 系统日志
单例的实现方法
所有的单例模式都至少拥有以下3种公共元素:
- 拥有一个构造函数,并且必须被标记为private
- 拥有一个保存类的实例的静态成员变量
- 拥有一个访问这个实例的公共静态方法,用于创建或获取它本身的静态私有对象
单例的例子
第一种:
<?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];
}