單例模式

常規類

/*
 * 常規類一但被實例就會創建一個新的對象一級新的資源ID和內存空間作爲保存。
 * 常規類的實例出來對象都不相等的
**/
class Obj{
	public $str = null;
	public function __construct(){
		$this->str = mt_rand(111,999);
	}
}

$s1 = new Obj();
$s2 = new Obj();
$s3 = new Obj();
print_r($s1);
print_r($s2);
print_r($s3);

結果:
Obj Object ( [str] => 931 ) Obj Object ( [str] => 978 ) Obj Object ( [str] => 779 )

單例模式

單例模式:一個類只有一個實例。而且是內部自行實例化並向整個系統全局地提供這個實例。它不會創建實例副本。而是返回單例類內部存儲的實例一個引用。

<?php
/**
 * Created by PhpStorm.
 * User: admin
 * Date: 2019/12/25
 * Time: 15:04
 */

/**
 * 如何寫一個屬於自己的單例類?
 * 寫一個單例類的規則:
 * 1.有一個靜態成員變量來保存類的唯一實例
 * 2.構造函數和克隆函數都是私有的
 * 3.公共的靜態方法可以訪問類的實例作爲一個引用返回
 * 4.只能實例化一次
 */

class Obj
{
    protected static $_Ins;
    public $str = null;
    private function __construct(){
    	$this->str = mt_rand(111,999);
    }
    private function __clone()
    {
        
    }
    public static function getInstance(){
        if (!(self::$_Ins instanceof self)){
            self::$_Ins = new self();
        }
        return self::$_Ins;
    }
}

$s1 = Obj::getInstance();
$s2 = Obj::getInstance();

print_r($s1);
print_r($s2);

結果:
Obj Object ( [str] => 598 ) Obj Object ( [str] => 598 )

註釋
instanceof作用:(1)判斷一個對象是否是某個類的實例,(2)判斷一個對象是否實現了某個接口。

單例模式的使用場景和優缺點

  • 優點:一個類不管多少次實例化,永遠只會執行一次操作。其實實例化操作都只是返回了一個對象應用。也就是說我們在沒有使用單例模式,一個對象被創建時同時也會分配一個資源ID和一個內存空間。
  • 場景:
    1.Session類
    2.購物車
    3.項目配置類
    4.數據庫
    5.讀取文件類

PHP單例模式的缺點
PHP動態腳本語言,也是解析型語言。那麼PHP的這種運行機制,使得PHP頁面被解析過後會回收所有相關的資源。也就是說呢?PHP是不支持變量或者對象在內存中以常駐的方式存在的。所以PHP,所有的變量無論是全局變量還是類的靜態成員都是頁面級的。每一次頁面的刷新都會創建新的對象,而解析完之後就回收。這樣一來,PHP的單例就沒有多大的意義了。但我們在實際項目當中,用戶所請求的頁面會用多個應用場景共享一個資源。那麼此時單例就很有意義了。當然我們也可以把單例對象放入到緩存中,做到強類型語言一樣的全局使用。

發佈了12 篇原創文章 · 獲贊 1 · 訪問量 7129
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章