當PHP5的出現物件導向思想,我們在構造PHP程式時候就有了對程式的新的總結,把對象特性封裝到類,特別是當PHP架構應用到實際項目中,構造類的對象和調用類對象出現了很大的講究。
我們很多時候會發現,我們在寫一些程式的時候,期望只要第一次構造了該對象,以後操作就是直接對該對象進行其他動作的操作,其實,每個類在構造一個對象後都是可以實現對象對方法或屬性的調用,這是物件導向最為基本的做法。但是如果你研究了一些框架組合後,特別是應用到MVC模式下的架構開發程式,你會發現一個Controller裡面會有很多個action,也就是我們所說的控制器裡的方法有很多,當然你也會發現當一個控制器控制一個事務對象操作的時候,裡面會出現很多次構造對象,操作資料集合的動作,但是你也會發現如果每次都是靠NEW方式去構造對象的話,無疑就是一次次給自己的記憶體空間增加負擔。因為構造一個新的對象無疑就是要分配一個新的記憶體空間給它,但是如果你其實只是要求同一個對象動作的延續,那麼試圖尋找已經構造好的對象,並調用它無疑是個很不錯的想法。所謂,同一對象的動作的延續,這個問題其實也很好解釋,比如我現在構造一個控制器類為Controller A,裡面是對資料Model A的一個添加,刪除等操作,那麼我們的控制動作就會存在假設為action Add ,actionDelete ,按照常規,我們通常利用框架組的單點入口原理,通過路由分配器程式找到了Controller A,但是裡面會如果要單獨調用actionAdd或,actionDelete ,且兩個動作都是對Model A進行的資料操作,每次操作按照常規都必須構造資料對象,然後調用SQL去執行資料庫操作,假設構造兩個動作都要去操作同一個資料對象時候調用的方法時候都是在使用同一個語句$a=new A()這種形式的話,兩次操作其實就產生了兩個對象,也就同時佔用兩倍的記憶體空間,試想不過就是要求同一個人去實施兩個動作,有必要兩個人分別去做兩件事情麼,顯然這種條件下是等於資源浪費,而且當動作多了的時候就會出現大量對象資源佔用記憶體嚴重導致系統效能下降,最終嚴重的就導致崩潰。
其實,我們在寫很多程式的時候也都一再強調,技術完成功能只是最基礎的一部分,一個好的程式或是網站,要研究的不僅僅是功能問題,更重要的是整體效能,特別是對於大型講究效用的程式來說效能是非常重要的。這點上框架組合是非常不錯的典範,它們善於合理使用地址引用。讓如果能一個對象處理的事情,就讓一個對象來處理,把足夠的空間留給其他不同的類別的對象。
框架組合解決對象資源是否重用的最好的方法就是全域變數的使用,當你的對象建立存在的時候,一般是第一次建立時候,就把它裝載到全域變數中,我們也可以叫做註冊對象,所以以後考慮對象調用方法的時候就直接去Check全域變數中是該類對象,也就是說看其是否註冊了該對象,如果存在就直接返回該類對象,並告知地址,以便引用。這樣以來是很容易實現對象地址引用的。當建立所有物件變數指向同一記憶體空間的時候,我們說此刻他們只是名字不同,實際是同一對象。
於是,我們可以建立了這樣的程式碼如下:
p1=1;}function add(){$this->p1++;}function show(){return $this->p1;}}$test1=&getSingle('Test');$test1->add();$test2=&getSingle('Test');echo $test2->show();$test2->add();$test3=&getSingle('Test');echo $test3->show();if($test1===$test2)echo 'yes';elseecho 'no';?>
根據第一次建立對象後,第二次調用讀取資料時候的必然是以原對象為基礎的再操作,可以由後面的程式看到$test2去資料時候結果是2,然後進行add操作後,由$test3再讀取時候發現結果為3顯然是因為動作2完成的效果。由此,我們看到了利用同一對象進行分步操作的好處所在,在這裡是因為我們將代碼放在了一起,當然我們在使用架構的使用經常會出現這樣的情況就是將上面的$test1,$test2,$test3以及他們的動作分別放在同一個控制器的不同動作action中,因為動作塊是相互獨立的,因此,三個物件變數誰先誰後觸發最早建立這個對象記憶體空間都是隨機而定的。第一次先是檢測全域變數中是否註冊了該對象,並檢查對象地址是否儲存在全域變數中,以後就是對該對象地址進行比對和存取。