单例模式 经常被提起,我写了一个测试代码,简单的读取config配置的。
就是一个请求过程中,这个类的实例可以是相同的话,可以写成单例模式,只要new 一次。
一般可以应用在 配置文件,log记录,数据库连接池,服务连接池这些方面。我就写一个最简单的例子
class ConfigSingleton
{
public static $instance;
public static $config;
public static function getInstance()
{
if (null == static::$instance)
{
static::$instance = new static;
}
return static::$instance;
}
public function getConfig()
{
return $this->loadConfig();
}
public function loadConfig()
{
if (null == self::$config)
{
self::$config = require_once(__DIR__ . "/../../../config/config.php");
}
return self::$config;
}
private function __construct()
{
}
private function __clone()
{
}
private function __wakeup()
{
}
}
使用:
$first = ConfigSingleton::getInstance();
$a = $first->getConfig();
var_dump($first);
var_dump($a);
$second = ConfigSingleton::getInstance();
$b = $second->getConfig();
var_dump($second);
var_dump($b);
可以看到
f
i
r
s
t
和
first和
first和second是完全一样的对象。
这里面看到用到了static::
i
n
s
t
a
n
c
e
而不是
s
e
l
f
:
:
instance而不是self::
instance而不是self::instance. 这个是php的 static 和self 的区别,延迟绑定。
如果是多进程情况下,那怎么共享这些配置呢?因为php一个请求都是一个进程,这些static的值不能进程间共享,所以只能通过第三方共享了。