Application scenarios
Database connector
Log recorder
Application lock file (theoretically there is only one lock file for the entire application...)
structure
Four private and one public
Privatization construction method: prevent the use of new to create multiple instances;
privatization cloning method: prevent clone multiple instances;
privatization reconstruction method: prevent deserialization
privatization static properties: prevent direct access to storage instance properties
Demo
<?php
/**
* 普通类
* Class Db1
*/
class Db1
{
public static $instance = null;
public static function getInstance()
{
if (null === static::$instance) {
static::$instance = new static();//实例化自身
}
return static::$instance;
}
public function __construct()
{
}
public function __clone()
{
}
public function __wakeup()
{
}
}
$db1 = new Db1();
$db2 = new Db1();
$db3 = clone $db2;
$db4 = Db1::getInstance();
$db5 = unserialize(serialize($db4));
var_dump($db1);
echo '<hr>';
var_dump($db2);
echo '<hr>';
var_dump($db3);
echo '<hr>';
var_dump($db4);
echo '<hr>';
var_dump($db5);
echo '<hr>';
//打印结果
object(Db1)#1 (0) { }
object(Db1)#2 (0) { }
object(Db1)#3 (0) { }
object(Db1)#4 (0) { }
object(Db1)#5 (0) { }
/**
* 单例
* Class Db2
*/
class Db2
{
private static $instance = null;
public static function getInstance()
{
if (null === static::$instance) {
static::$instance = new static();
}
return static::$instance;
}
/**
* 防止使用 new 创建多个实例
*
* Db2 constructor.
*/
private function __construct()
{
}
/**
* 防止 clone 多个实例
*/
private function __clone()
{
}
/**
* 防止反序列化
*/
private function __wakeup()
{
}
}
$db6 = Db2::getInstance();
$db7 = Db2::getInstance();
var_dump($db6);
echo '<hr>';
var_dump($db7);
echo '<hr>';
//输出结果 实例化后对象被存储 程序自始至终只做一次实例化
object(Db2)#6 (0) { }
object(Db2)#6 (0) { }