php单例模式的讲解(代码示例)
来源:转载
发布时间:2018-10-25 15:26:27
阅读量:963
本篇文章给大家带来的内容是关于php单例模式的讲解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
单例模式是一种比较常用的设计模式,在很多框架中可以看到它的身影。通过单例模式可以确保类只有一个实例化,从而方便对实例个数的控制并节约系统资源。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <?php
use \Exception;
class Singleton
{
/**
* 对象实例
* @ var object
/
public static $instance ;
/**
* 获取实例化对象
/
public static function getInstance()
{
if (!self:: $instance instanceof self) {
self:: $instance = new self();
}
return self:: $instance ;
}
/**
* 禁止对象直接在外部实例
/
private function __construct(){}
/**
* 防止克隆操作
/
final public function __clone()
{
throw new Exception( 'Clone is not allowed !' );
}
}
|
一个系统中可能会多次使用到单例模式,为了更加方便的创建,可以试着建立一个通用的抽象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <?php
use \Exception;
abstract class SingletonFacotry
{
/**
* 对象实例数组
* @ var array
/
protected static $instance = [];
/**
* 获取实例化对象
/
public static function getInstance()
{
$callClass = static ::getInstanceAccessor();
if (! array_key_exists ( $callClass , self:: $instance )) {
self:: $instance [ $callClass ] = new $callClass ();
}
return self:: $instance [ $callClass ];
}
abstract protected static function getInstanceAccessor();
/**
* 禁止对象直接在外部实例
/
protected function __construct(){}
/**
* 防止克隆操作
/
final public function __clone()
{
throw new Exception( 'Clone is not allowed !' );
}
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php
class A extends SingletonFactory
{
public $num = 0;
protected static function getInstanceAccessor()
{
return A:: class ;
}
}
$obj1 = A::getInstance();
$obj1 ->num++;
var_dump( $obj1 ->num);
$obj2 = A::getInstance();
$obj2 ->num++;
var_dump( $obj2 ->num);
|