詳解 PHP 中的三大經典模式

2021-10-02 04:33:52 字數 3316 閱讀 8972

單例模式

單例模式的含義:

作為物件的建立模式,單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統全域性地提供這個例項。它不會建立例項副本,而是會向單例類內部儲存的例項返回乙個引用。

單例模式的三個要素:

儲存類唯一例項的靜態變數。

建構函式和轉殖函式必須是私有的,放在外部去例項化,這樣就不存在單例模式的意義。

提供乙個可供外部訪問的公共靜態方法,這個方法返回該類的唯一例項。

單例模式的意義:

在 php 中的應用主要在於資料庫應用, 所以乙個應用中會存在大量的資料庫操作, 在使用物件導向的方式開發時, 如果使用單例模式, 則可以避免大量的 new 操作消耗的資源。而不完全是對系統資源的節省, 可以避免重複例項化,因為 php 每次例項化乙個類之後都會清理掉對應的資源,當再次使用的時候又會在重新去例項化一次。

單例模式使用的場景:

資料庫操作,減少對資料路的 new 操作,從而減少記憶體資源和系統資源的消耗。

配置資源的共享,在乙個系統中,配置資源都是全域性的,使用單例模式也可以減少每次去讀取配置帶來的記憶體和系統資源的消耗。

**演示:

<?php

class single

public static function getinstance($attribute = '我是程式設計浪子走四方1')

}

單例模式和非單例模式的區別:

class single 

}$single1 = new single();

$single2 = new single();

var_dump($single1);

var_dump($single2);

if ($single2 === $single1) else

// object(single)#1 (0)

// object(single)#2 (0)

// 不是同乙個物件

class single2

// 2.宣告乙個靜態的公共方法,使用者外部呼叫本類的例項

public static function getinstance()

return self::$instance;

}//3. 轉殖函式私有化,避免外部clone(每clone一次,就不是同乙個例項)

private function __clone()

}$singledemo1 = single2::getinstance();

$singledemo2 = single2::getinstance();

var_dump($singledemo1->getinstance());

var_dump($singledemo2->getinstance());

if ($singledemo1 === $singledemo2) else

// object(single2)#3 (0)

// object(single2)#3 (0)

// 是同乙個物件

工廠模式

工廠模式的有含義:

負責生成其他物件的方法。簡單的描述就是通過乙個工廠類,去例項化其他類或者方法。

工廠模式的意義:

通過使用工廠模式,減少因為多處 new 同乙個類,當這個類發生變法時,則需要多處修改。

**演示:

<?php

class factor

}class db

}$db = factor::createdb();

註冊樹模式

註冊數的含義:

註冊樹就是將多個物件註冊在乙個物件池中,當我們需要使用時,直接從物件池獲取即可。

註冊數模式的優點:

單例模式解決的是如何在整個專案中建立唯一物件例項的問題,工廠模式解決的是如何不通過 new 建立例項物件的方法。

那麼註冊樹模式想解決什麼問題呢?

在考慮這個問題前,我們還是有必要考慮下前兩種模式目前面臨的侷限。

首先,單例模式建立唯一物件的過程本身還有一種判斷,即判斷物件是否存在。存在則返回物件,不存在則建立物件並返回。

每次建立例項物件都要存在這麼一層判斷。

工廠模式更多考慮的是擴充套件維護的問題。

總的來說,單例模式和工廠模式可以產生更加合理的物件。

怎麼方便呼叫這些物件呢?

而且在專案內如此建立的物件好像散兵游勇一樣,不便統籌管理安排啊。因 而,註冊樹模式應運而生。

不管你是通過單例模式還是工廠模式還是二者結合生成的物件,都統統給我 「插到」 註冊樹上。我用某個物件的時候,直接從註冊樹上取 一下就好。

這和我們使用全域性變數一樣的方便實用。 而且註冊樹模式還為其他模式提供了一種非常好的想法。

**演示:

<?php

/** * 單例模式

*/class single

public static function getinstance($attribute = '個人技術1')

}/**

* 工廠模式

*/class factory

}/**

* 註冊模式

* 含義:就是將物件放在乙個物件池中,使用的時候直接去物件池查詢.

* 需要如下幾個操作:

* 1.註冊

* 2.存放物件池

* 3.獲取

* 4.銷毀

*/class register

// 通過物件別名在物件池中獲取到物件別名

public static function get($key)

// 通過物件別名將物件從物件池中登出

public static function _unset($key)

}register::set('single', factory::createobj());

$single = register::get('single');

print_r($single);

echo $single::$attribute;

三大經典表連線

nested loop join 區域性掃瞄的oltp 驅動結果集的條數決定被驅動表的訪問次數 效能與驅動表順序有關 無特殊寫法限制 驅動表 被驅動表限制條件建立索引 小結果集驅動大結果集 hash join olap全表掃瞄 兩表只會訪問1次或0次 效能與驅動表順序有關 不能用於 between ...

PHP安裝十大經典問題

1.unix windows 我的php ini 檔案應該放在哪?unix下預設它應該放在 usr local lib 目錄下。這是它的 lib.很多人會在編譯時改變它,使用 with config file path 標誌。例如,你可以這樣設它 with config file path etc ...

機器學習教材中的 7 大經典問題

如果希望了解機器學習,或者已經決定投身機器學習,你會第一時間找到各種教材進行充電,同時在心中預設 書裡講的是牛人大神的畢生智慧型,是正確無誤的行動指南,認真學習就能獲得快速提公升。但實際情況是,你很可能已經在走彎路。科技發展很快,資料在指數級增長,環境也在指數級改變,因此很多時候教科書會跟不上時代的...