1. 程式人生 > >PHP設計模式(一)——單例模式(Singleton Pattern)

PHP設計模式(一)——單例模式(Singleton Pattern)

PHP設計模式(一)——單例模式(Singleton Pattern)

單例模式(Singleton Pattern):顧名思義,就是隻有一個例項。作為物件的建立模式,單例模式確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。

(一)為什麼要使用PHP單例模式

  1. php的應用主要在於資料庫應用, 一個應用中會存在大量的資料庫操作, 在使用面向物件的方式開發時, 如果使用單例模式,
    則可以避免大量的new 操作消耗的資源,還可以減少資料庫連線這樣就不容易出現 too many connections情況。
  2. 如果系統中需要有一個類來全域性控制某些配置資訊, 那麼使用單例模式可以很方便的實現。
  3. 在一次頁面請求中, 便於進行除錯, 因為所有的程式碼(例如資料庫操作類db)都集中在一個類中, 我們可以在類中設定鉤子, 輸出日誌,從而避免到處var_dump, echo

(二)單例模式的實現

  1. 私有化一個屬性用於存放唯一的一個例項
  2. 私有化構造方法,私有化克隆方法,用來建立並只允許建立一個例項
  3. 公有化靜態方法,用於向系統提供這個例項
class Singleton
{
//存放例項
    private static $_instance = null;

//私有化構造方法
    private function __construct()
    {
        echo "單例模式的例項被構造了";
    }

//私有化克隆方法
    private function __clone()
    {
    }

//公有化獲取例項方法
    public static function getInstance()
    {
        if (!(self::$_instance instanceof Singleton)) {
            self::$_instance = new Singleton();
        }
        return self::$_instance;
    }
}

$singleton = Singleton::getInstance();

(三)使用Trait關鍵字實現類似於繼承單例類的功能

Trait Singleton
{ //存放例項
    private static $_instance = null;

//私有化克隆方法
    private function __clone()
    {
    }

//公有化獲取例項方法
    public static function getInstance()
    {
        $class = __CLASS__;
        if (!(self::$_instance instanceof $class)) {
            self::$_instance = new $class();
        }
        return self::$_instance;
    }
}

class DB
{
    public function __construct()
    {
        echo __CLASS__ . "單例模式被構造" . PHP_EOL;
    }
    public function test()
    {
        echo '這裡是呼叫的測試方法';
    }
}

class DBhandle extends DB
{
    use Singleton;
    private function __construct()
    {
        parent::__construct(); // 繼承父類的__construct
        echo __CLASS__ . "單例模式被構造" . PHP_EOL;
    }
}

$handle = DBhandle::getInstance();
$handle->test();