php 单例模式 序列化,php设计模式(二)单例模式
應用場景:
數據庫連接這種比較耗費資源的操作;
我們希望整個應用只實例化一個;
結構:
4私1公;
私有化構造方法: 防止使用 new 創建多個實例;
私有化克隆方法: 防止 clone 多個實例;
私有化重建方法: 防止反序列化
私有化靜態屬性: 防止直接訪問存儲實例的屬性
示例<?php
namespace Baijunyao\DesignPatterns\Singleton;
/**
* 普通類
*
* Class Db1
* @package Baijunyao\DesignPatterns\Singleton
*/
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 '
';
var_dump($db2);
echo '
';
var_dump($db3);
echo '
';
var_dump($db4);
echo '
';
var_dump($db5);
echo '
';
/**
* 單例
*
* Class Db2
* @package Baijunyao\DesignPatterns\Singleton
*/
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 '
';
var_dump($db7);
echo '
';
github:https://github.com/baijunyao/design-patterns/tree/master/singleton
運行代碼我們可以看到;
普通類DB1的句柄每個都是不一樣的;
一共5個實例;
而單例這兩個的句柄都是 27 ;
一直是一個實例;
總結
以上是生活随笔為你收集整理的php 单例模式 序列化,php设计模式(二)单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fedora apache php,Fe
- 下一篇: matlab scatter cdata