参考博文地址:https://github.com/baijunyao/design-patterns/blob/master/singleton/index.php
首先认识或者了解下单例模式的作用: 防止new多个实例,造成资源消耗过大,使用场景有数据库连接实例,通过单例,减少对mysql连接数量
普通实例创建代码
<?php
namespace Designpatterns\Singleton;
/*
普通类
*/
class Db1
{
public static $instance = null;
public function __construct()
{
}
public function __clone()
{
}
public static function getInstance()
{
if (null === static::$instance) {
static::$instance = new Db1();
}
return static::$instance;
}
}
$db1 = new Db1();
$db2 = new Db1();
$db3 = clone $db2;
$db4 = Db1::getInstance();
var_dump($db1);
echo "<br>";
var_dump($db2);
echo "<br>";
var_dump($db3);
echo "<br>";
var_dump($db4);
echo "<br>";
- 运行结果,可以看到上面几个实例都是不同的,各自生成了不同的实例
相比较之下 使用单例模式,看看它的效果
/*
单例
*/
class Db2
{
/*将instance 进行私有化*/
private static $instance = null;
/*将public的构造函数 私有化*/
private function __construct()
{
}
/*将public的克隆函数 私有化*/
private function __clone()
{
}
public static function getInstance()
{
if (null === static::$instance) {
static::$instance = new Db2();
}
return static::$instance;
}
}
// $db5 = new Db2(); //construct私有化 防止new多个实例
// $db6 = new Db2(); // 如果进行new会报错
// $db7 = clone $db5; //clone 和上面new 实例类似
$db8 = Db2::getInstance();
$db9 = Db2::getInstance();
// var_dump($db5);
// echo"<br>";
// var_dump($db6);
// echo"<br>";
// var_dump($db7);
// echo"<br>";
var_dump($db8);
echo"<br>";
var_dump($db9);
echo"<br>";
- 看看结果, 如果直接new会产生fatal,clone也是, 只有getInstance会获取到真正的实例对象,并且多个变量使用的都是同一个实例。
我们可以通过"三私一公"来记单例
- 私有的静态变量,构造函数,克隆函数
- 公共的静态方法获取实例
疑问:为什么设置私有静态变量?而不是普通变量?为什么需要私有?
因为静态变量的设置起到的作用就是为了多个变量使用同一个实例,即该静态变量,为防止直接访问静态变量或者修改其值,我们加上了private
(欢迎吐槽) https://github.com/wuye251/design-patterns