1. 程式人生 > >深入理解PHP單例模式的實現&static&clone

深入理解PHP單例模式的實現&static&clone

前提

提到單例模式,那就不得不說設計模式。

單例模式是最簡單的一種設計模式,提供了一種唯一訪問其物件的方式,可以直接訪問。

屬於建立型模式

實現之前,我們先要明白兩個關鍵字的原理

static

  • 宣告類屬性或方法為靜態,就可以不例項化類而直接訪問。靜態屬性不能通過一個類已例項化的物件來訪問(但靜態方法可以)。
  • 函式體中的靜態變數與全域性中的靜態變數不衝突,只有在關鍵字global作用下才會使區域性與全域性統一
  • 函式體中的靜態變數在函式呼叫的時候只會被初始化一次
  • 靜態方法可以呼叫靜態屬性,禁止呼叫非靜態屬性
  • class::method()呼叫本方法所在類,static::method()呼叫最後定義的方法

靜態變數和全域性變數均存放於全域性區,程式結束後仍存於記憶體

也就是說,當我們定義了一個靜態變數,就可以在全域性訪問它的屬性

clone

建立一個物件的副本。

只有在使用clone關鍵字時,__clone方法才會被呼叫

<?php
class A {
    public function __clone() {
        echo "clone function is being used" . "\n";
    }
    public $a;
}

$classA = new A();
$classB = $classA;
$classC = clone $classA;

echo "A === B ? :" . ($classA === $classB ? 'true' : 'false') . "\n";
echo "A === C ? :" . ($classA === $classC ? 'true' : 'false') . "\n";
?>

php的clone()方法對一個物件例項進行的淺複製,物件內的基本數值型別進行的是傳值複製,而物件內的物件型成員變數,如果不重寫clone方法,顯式的clone這個物件成員變數的話,這個成員變數就是傳引用複製,而不是生成一個新的物件.

淺複製時,屬性為物件的,屬性值仍然指向同一個變數地址

深複製則兩者完全無關,通過 __clone 方法將物件屬性加上重賦值

 或者 在複製時使用unserialize(serialize($obj));

因此在複製的過程中我們需要注意,它究竟是淺複製還是深複製

單例模式實現

OK,利用以上的關鍵字,我們就可以設計出一個比較合理的單例模式,將建構函式和__clone函式設為私有防止外界例項化或者克隆物件。

class InstanceClass
{
    private static $instances;

    private function __construct()
    {
    }

    private function __clone()
    {
    }

    /**
     * @return static
     */
    public static function getInstance()
    {
        if (!isset(self::$instances)) {
            
            self::$instances = new $InstanceClass;
        }
        return self::$instances;
    }
}

只能通過getInstance方法來呼叫物件

但其實這樣還是不完善,如何解決多執行緒單例模式,以及在多繼承中使用單例等等

這裡就不多說啦~~~~~

哈哈

相關推薦

深入理解PHP模式實現&static&clone

前提 提到單例模式,那就不得不說設計模式。 單例模式是最簡單的一種設計模式,提供了一種唯一訪問其物件的方式,可以直接訪問。 屬於建立型模式 實現之前,我們先要明白兩個關鍵字的原理 static 宣告類屬性或方法為靜態,就可以不例項化類而直接訪問。靜態屬性不能通過一

php模式實現物件只被建立一次

這是我在php面試題中遇到的一道試題,單例模式按字面來看就是某一個類只有一個例項,這樣做的好處還是很大的,比如說資料庫的連線,我們只需要例項化一次,不需要每次都去new了,這樣極大的降低了資源的耗費。 單例類至少擁有以下三種公共元素:     必須擁有一個建構函式,並

深入理解 JavaScript 模式 (Singleton Pattern)

概念 單例模式,也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例物件的類必須保證只有一個例項存在。 核心:確保只有一個例項,並提供全域性訪問。 實現思路 一個類能返回物件一個引用(永遠是同一個)和一個獲得該例項的方法(必須是靜態方法,通常命名為getIntance);當我們呼叫這個方法時,類

PHP 簡單理解模式static 關鍵字

php單例模式 單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個例項。即一個類只有一個物件例項。 要點主要有三個: 1.一個類只能有一個物件; 2.必須是自行建立這個類的物件; 3,要想整個系統提供

PHP 模式優點意義及如何實現

一、什麼是單例模式? 1、含義       作為物件的建立模式,單例模式確保某一個類只有一個例項,而且自行例項化並向整個系統全域性地提供這個例項。它不會建立例項副本,而是會向單例類內部儲存的例項返回一個引用。 2、單例模式的三個要點: (1). 需要一個儲存類

PHP 模式 工廠模式 策略模式程式碼理解

//單個類 單例 <?php /** *單例模式:一個類只能有一個物件 *三私一公 */ class MySQLDB { private static $instance; //私有的成員用來儲存類的例項 private function __construct()

PHP模式實現

  class SingleInstance{                private function _construct(){                    }               private static $instance;              private fun

[js高手之路]設計模式系列課程-模式實現模態框

ges 點擊 eat abs select nbsp str osi 控制 什麽是單例呢? 單,就是一個的意思。例:就是實例化出來的對象,那合在一起就是保證一個構造函數只能new出一個實例,為什麽要學習單例模式呢?或者說單例模式有哪些常見的應用場景.它的使用還是很廣泛,比如

模式實現

鎖定 word nal ron 單例模式 tin public 原子操作 == 靜態內部類(static nested class) 優先考慮 public class LazySingleton{ private LazySingleton(){}

Java的模式實現

java 單例模式 只能生成一個實例的類是實現了Singleton(單例)模式的類。以下為C#實現單例模式的方式方式一只使用於單線程環境// 把構造函數設為私有函數以禁止他人創建實例 // 定義一個靜態的實例,在需要的時候創建該實例 // 在Singleton的靜態屬性Instance中,只有

php模式

sta 導致 一是 所有 代碼 fig 數量 方法 具體實現 php單例模式 單例模式,是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例。即一個類只有一個對象實例。 要點主要有三個: 1.一個類只能有一個對

PHP模式簡記

結果 隱私 php單例模式 tin ont st2 受保護 src 如何實現 單例模式:只能實例化一次即為單例模式 如何實現只能實例化一次:突破口在於類的構造函數,我們把構造方法變為隱私或者受保護的方法,然後執行代碼 <?php Class Temp {

Java模式&static成員變量 區別

instance .net 技術分享 static成員 使用 過程 () http 一加 當需要共享的變量很多時,使用static變量占用內存的時間過長,在類的整個生命周期。 而對象只是存在於對象的整個生命周期。 //餓漢式 class Sing

c#之使用模式實現數據庫連接

strings instance ssl div lock config onf 鎖定 特殊 1、使用程序集Oracle.ManagedDataAccess.dll using Oracle.ManagedDataAccess.Client; using System.Co

模板方法模式 + 觀察者模式 + 簡單工廠模式 + 模式實現一個簡單的數據表讀寫

private 數據庫鏈 obs imp 通知 model 數據表 ring pri 實現功能: 對數據表的讀要緩存起來,對數據表的寫需要清除緩存. 數據表根據屬性字段來決定是否緩存 可以更換數據庫鏈接方式,比如可以隨時更換為mysql或mysqli() 當插入數據時給出一

設計模式模式實現(C++)

pan sin ace pen bsp ati one delet friend #ifndef SINGLETON_H #define SINGLETON_H #include <cassert> #include <memory> #incl

模式實現方法之懶漢式、餓漢式

項目 只有一個 接下來 程序設計 選擇 bsp 私有 syn 屬性 Singleton 單例模式是一種經常在項目開發中使用的程序設計模式,它用於創建一個全局共享的實例對象。該實例對象在整個應用程序中只有一個,不會出現更多的該實例對象。 實現原理就是將類的構造方法私有化,即使

php 模式封裝MySQL類

function RR sqli self () tab pub con 實例化 class MysqlConn {  //定義一個私有的靜態屬性,用來存放實例化的對象 private static $dbcon;  //定義一個私有的靜態屬性,用來存在數據庫的連接

php 模式

span php sql gb2312 pre 連接 ceo 單例 數據 單例模式當需要保證某個對象只能有一個實例的時候,單例模式非常有用。它把創建對象的控制權委托到一個單一的點上,任何時候應用程序都只會僅有一個實例存在。 單例模式中必須包含:private 的構造函數、靜

php模式之“三私一公”

外部 特點 概念 失去 spa get ins 應用 而且 單例模式的概念 單例模式是指整個應用中某個類只有一個對象實例的設計模式。具體來說,作為對象的創建方式,單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統全局的提供這個實例。它不會創建實例副本,而是會向單