PHP 設計模式之單例模式

echo_dump發表於2020-06-14

PHP設計模式之單例模式

  1. 單例模式在設計模式中是屬於建立型的型別

  2. 單例模式可以使一個程式處理請求過程中,只建立一次,減少類的頻繁例項化

  3. 單例模式不可以在外部例項化,也就是構造方法要設定為私有的方法

  4. 單例模式只需要向外部提供一個公開的靜態方法介面,給外部呼叫者使用

  5. 單例模式要提供一個私有的克隆方法,防止外部克隆產生一個新的副本

  6. 單例模式需要提供一個私有的防止類序列化的方法,以免產生一個新的副本

  7. 單例模式可以分類餓漢式和飽漢式等等,在這裡我們就提供一個餓漢式的單例模式

  8. 單例模式一般可以用於資料層的連線(資料庫的連線)

  9. 可以把單例模式建立的類設定為 final,就是這是一個最終的類,不許繼承,不許修改

  10. 具體PHP實現單例模式如下:

final class DbConnect
{
    private static $instance = null;

    /**
     * 防止外部例項化
     * DbConnect constructor.
     */
    private function __construct()
    {
        try {
            $dsn = 'mysql:dbname=test;host=127.0.0.1;port=3306';
            $username = 'root';
            $password = 'root';
            static::$instance = new \PDO($dsn, $username, $password);

        } catch (\PDOException $e) {
            die('PDO connect is error!' . $e->getMessage());
        } catch (\Exception $e) {
            var_dump($e->getMessage());
        }

    }

    /**
     * Notes: 防止克隆產生一個副本
     * Name: __clone
     * User: LiYi
     * Date: 2020/6/14
     * Time: 12:04
     */
    private function __clone()
    {
        // TODO: Implement __clone() method.
    }

    /**
     * Notes:防止序列化產生副本
     * Name: __wakeup
     * User: LiYi
     * Date: 2020/6/14
     * Time: 12:04
     */
    private function __wakeup()
    {

    }

    /**
     * Notes:對外提供的一個唯一的訪問介面
     * Name: getInstance
     * User: LiYi
     * Date: 2020/6/14
     * Time: 12:05
     */
    public static function getInstance()
    {
        //單例模式有餓漢式和飽漢式之分
        //餓漢式就是例項化這個類的時候,先判斷是否建立,沒有建立才去例項化
        //飽漢式就是進來就先建立,然後返回
        //在PHP中,一般的執行環境都是LNPM,安裝PHP的時候也是一般安裝的是執行緒安全的版本,沒有多執行緒,一般都是一個請求進來,就是一個程式,所
        //以同一個請求就是一個程式,對開發來說這個很簡單,不需要去考慮執行緒安全與否,那麼我們在建立的時候,就在這裡使用餓漢式

        if (null === static::$instance) {
            new self();
        }

        return static::$instance;
    }
}
  1. 測試程式碼如下:
class Client
{
    public function __construct()
    {
        $test1 = DbConnect::getInstance();

        $sql = "SELECT user,host FROM mysql.user WHERE user = :user";
        $statement = $test1->prepare($sql);

        $username = 'root';
        $statement->bindParam(':user', $username);
        $statement->execute();
        $users = $statement->fetchAll();
        print_r($users);
        var_dump(($test1->query('SELECT user,host FROM mysql.user;'))->fetchAll());
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
LIYi ---- github地址

相關文章