網上看到一些達人寫購物車用“單例模式”,不知道是怎麼考慮的,按照java下的單例模式理解,豈不是整個應用程式都只有一個購物車類了?這樣購物車資料不就在一起混著了嗎?同時,PHP是指令碼語言,單例模式有意義嗎?頁面執行完,不是所有的東西都被回收?請對PHP單例模式機制有深入瞭解的大神在這裡談談自己的看法,謝謝!
PS.比如這個達人寫的購物車:http://www.thinkphp.cn/topic/5205.html
回複內容:
網上看到一些達人寫購物車用“單例模式”,不知道是怎麼考慮的,按照java下的單例模式理解,豈不是整個應用程式都只有一個購物車類了?這樣購物車資料不就在一起混著了嗎?同時,PHP是指令碼語言,單例模式有意義嗎?頁面執行完,不是所有的東西都被回收?請對PHP單例模式機制有深入瞭解的大神在這裡談談自己的看法,謝謝!
PS.比如這個達人寫的購物車:http://www.thinkphp.cn/topic/5205.html
有意義呀,比如你有個資料庫物件 DB,非單例的做法就是每次用時
$db = new DB();....$db->query("....");
用單例,你只需要在Factory 方法裡判斷是否已經初始化過了對象,有就返回,第一次就初始化,程式退出時斷開(__destruct),用起來就簡單了。
$db = DB::getInstance();$db->query("....");// 或$db = DB::getInstance("db2");$db->insert("xxx", $data);
甚至直接封裝成常用函數
DB::query("....");
這樣如果你的程式裡有很多位於不同層級的地方要使用 DB 對象,只管找 DB 類要就是了,第一次的時候串連,之後都不會重複串連資料庫。
單例的應用面很廣,可以用在 Cache, Log 等各種資源需要被頻繁調用的地方。
哦,你是在拿 Java 的比較呀。單例並非你想的那樣必須整個程式(姑且理解為進程吧)一個執行個體,要看編寫的人怎麼做的和他的意圖。在 Servlet 裡有 Request, Application, Session 幾個不同的範圍,當然也可以利用 LocalThread 等線上程內共用,我猜想你同事的購物車應該是 Session 或 Application 下的吧,只會對當前會話或應用有效。
PHP是指令碼語言,單例模式有意義嗎?頁面執行完,不是所有的東西都被回收?
你這裡說的並沒有錯,但是說php單例模式沒有意義就要打問號了,我php架構緊緊熟悉CI,CI也不例外的採用單利模式
public static function &get_instance(){ return self::$instance;}
那麼他為什麼要這麼做呢?我舉一個簡單的例子,ci允許使用者使用第三方類庫,或者你自己寫的協助類等等。你在使用這些類庫的時候,如果你想在這些類庫中持有對CI的引用的話,很見得的一個方法,直接在某個功能模組中get_instance,就得到了你本次執行的CI執行個體了,試想一下,CI樣本的上下文環境也被隨之帶過來了,那麼就可以使用你的類庫來對CI執行個體中的一些資料進行一些處理了。
我這裡這麼說,興許還是有些牽強,也許會有人說CI那裡壓根就不是單例模式,構造方法都不是私人的,那我只能說你對單例理解有點狹隘了。
在一個php架構的核心,絕對是不需要你載入兩個的,一次執行中,一個就夠了。