php 单例模式 序列化,php设计模式(二)单例模式
應(yīng)用場(chǎng)景:
數(shù)據(jù)庫連接這種比較耗費(fèi)資源的操作;
我們希望整個(gè)應(yīng)用只實(shí)例化一個(gè);
結(jié)構(gòu):
4私1公;
私有化構(gòu)造方法: 防止使用 new 創(chuàng)建多個(gè)實(shí)例;
私有化克隆方法: 防止 clone 多個(gè)實(shí)例;
私有化重建方法: 防止反序列化
私有化靜態(tài)屬性: 防止直接訪問存儲(chǔ)實(shí)例的屬性
示例<?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 創(chuàng)建多個(gè)實(shí)例
*
* Db2 constructor.
*/
private function __construct()
{
}
/**
* 防止 clone 多個(gè)實(shí)例
*/
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
運(yùn)行代碼我們可以看到;
普通類DB1的句柄每個(gè)都是不一樣的;
一共5個(gè)實(shí)例;
而單例這兩個(gè)的句柄都是 27 ;
一直是一個(gè)實(shí)例;
總結(jié)
以上是生活随笔為你收集整理的php 单例模式 序列化,php设计模式(二)单例模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fedora apache php,Fe
- 下一篇: php padright,[扩展推荐]