




已閱讀5頁,還剩11頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
PHP 中的 9 個魔術方法這個標題有點牽強因為php有不只9種魔術方法, 但是這些將會引導你使用php魔術方法一個好的開始。它可能魔幻,但是并不需要魔杖。 這些魔術方法擁有者特殊的名字,以兩個下劃線開始,表示這些方法在php特定事件下將會被觸發。這可能聽起來有點自動魔法但是它真的很酷的,我們已經看過一個簡單的例子在 last post,即我們使用一個構造器-使用這個作為我們第一個例子_construct 構造器是一個魔術方法,當對象被實例化時它會被調用。在一個類聲明時它常常是第一件做的事但是沒得必要他也像其他任何方法在類中任何地方都可以聲明,構造器也能像其他方法樣繼承。如果我們想到以前繼承例子從介紹到oop,我們能添加構造方法到Animal 類中,如:1class Animal2 3 public function _construct() 4 $this-created = time();5 $this-logfile_handle = fopen(/tmp/log.txt, w);6 7 8現在我們創建一個類來繼承Animal類 - Penguin類!不添加任何屬性和方法在Penguin類中,我們能申明并定義它繼承自Animal類,如: 1class Penguin extends Animal 2 34 5$tux = new Penguin;6echo $tux-created;如果我們定義一個構造方法在Penguin類中,然后Penguin對象將會運行當它被實例化后。由于并沒有構造方法,PHP 會參考父類方法定義 信息來使用它因此我們能覆蓋父類方法,或者不,在我們的新類中-很便利。_destruct你發現文件句柄也是構造器一部分嗎?當我們使用完一個對象時真不想把事情放一邊,因此析構方法做著與構造方法相反的事情。當對象被銷毀時,析構方法會運行,或者明確的說當我們不再使用它時,php會為我們清理掉。Animal類中,我們的析構方法像這樣,如:01class Animal02 03 public function _construct() 04 $this-created = time();05 $this-logfile_handle = fopen(/tmp/log.txt, w);06 07 08 public function _destruct() 09 fclose($this-logfile_handle);10 11析構器讓我們關閉任何額外的資源比如被使用過的對象。在php中由于我們有這樣運行時間短的腳本(留意在更新的php版本中增強的垃圾回收機制),通常討論內存溢出根本不需要。然而它仍是好的推行方法來清理而且總體上讓程序運行起來更高效。 _get這個魔術方法是一個非常靈巧的小技巧 - 它使實際上不存在的屬性如同存在一半。讓我們舉個小企鵝的例子:01class Penguin extends Animal 02 03 public function _construct($id) 04 $this-getPenguinFromDb($id);05 06 07 public function getPenguinFromDb($id) 08 / elegant and robust database code goes here09 10現在,如果我們的小企鵝有一個 name 屬性,而在此之后加載的屬性為 age,那么我們可以這樣處理:1$tux = new Penguin(3);2echo $tux-name . is . $tux-age . years oldn;然而,設想一下,后端數據庫或數據供應者發生了改變,name沒有了,變味了username。并且設想這是一個非常復雜的應用,而需要修改的調用name的地方非常多。我們可以使用 _get 方法,使得name屬性如同存在一樣:01class Penguin extends Animal 02 03 public function _construct($id) 04 $this-getPenguinFromDb($id);05 06 07 public function getPenguinFromDb($id) 08 / elegant and robust database code goes here09 10 11 public function _get($field) 12 if($field = name) 13 return $this-username;14 15這并不是編寫整個系統的好方法,因為它會讓調試工作變得更困難,但它是一個非常有價值的工具。它允許如同屬性一樣使用或者展示需要經過計算的數據,以及無數我都想不到的地方。_set那么,我們將所有對 $this-name 的調用都更改為返回 $this-username的值,那么,如果我們想要設置這個值呢?也許我們有一個賬戶界面允許用戶修改他們的名字。這時我們就需要 _set 方法的幫助了,舉例說明:01class Penguin extends Animal 02 03 public function _construct($id) 04 $this-getPenguinFromDb($id);05 06 07 public function getPenguinFromDb($id) 08 / elegant and robust database code goes here09 10 11 public function _get($field) 12 if($field = name) 13 return $this-username;14 15 16 17 public function _set($field, $value) 18 if($field = name) 19 $this-username = $value;20 21 22這樣,我們就針對大量的調用偽造對象的屬性,正如我說的,這并不是一個正統的方法,但卻是一個很有用的技巧,值得記住。_call這里有兩種近似的方法,我并沒有單獨列出來,而是一起說明。一個是 _call 方法,如果定義,它將在調用未定義過的方法時被調用;另一個是 _callStatic 方法,工作方式與第一個相同,但卻是在調用未定義的靜態方法時生效(PHP 5.3 加入).通常我使用 _call 進行友善的錯誤處理,這在需要別人整合調用你的方法的庫代碼中非常有用。例如,如果一段腳本擁有一個企鵝對象,名為 $penguin ,它包含一個 $penguin-speak() 方法.假設 speak() 方法沒有定義,那么正常情況下我們會看到:PHP Fatal error: Call to undefined method Penguin:speak() in .通過定義 _call 方法,我們可以使用一些更友善的提示信息來代替 PHP 的錯誤提示:01class Animal 0203class Penguin extends Animal 04 05 public function _construct($id) 06 $this-getPenguinFromDb($id);07 08 09 public function getPenguinFromDb($id) 10 / elegant and robust database code goes here11 12 13 public function _get($field) 14 if($field = name) 15 return $this-username;16 17 18 19 public function _set($field, $value) 20 if($field = name) 21 $this-username = $value;22 23 24 25 public function _call($method, $args) 26 echo unknown method . $method;27 return false;28 29這將捕獲的錯誤并回應。在實際應用中,更合適的方法是依據你的需要紀錄消息日志,將用戶重定向,或者拋出一個異常,但概念是相同的。在這里你可以處理任何你需要處理的不當調用,你可以檢測方法的名稱,并一一處理例如,你可以同上面我們重命名屬性一些樣重命名方法。_sleep_sleep()方法會被調用當對象被序列化后,并允許你處理序列化。這有各種各樣的程序,一個很好的例子如果一個對象包含某種類型的指針,例如文件句柄或引用另一個對象。當對象被序列化然后解序列化,這些引用類型是無用的,因為這些類型的引用的目標可能不再存在或有效。因此,最好是來取消這些信息在存儲它們之前。_wakeup_wakeup()是與_sleep()方法相反的,允許您更改對象解序列化的行為。和_sleep()一起使用,可以用來恢復被刪除的句柄和對象當對象被序列化時。一個很好的例子程序是數據庫句柄被取消設置當該項被序列化,然后恢復到當前配置中設置項目時,解序列化一個數據庫句柄。_clone我們看過一個使用clone關鍵字的例子,在我的介紹從入門到oop的第二部分,創建對象的副本,而不是有兩個變量指向同一個實際的數據。在一個類中重寫此方法,我們可以觀察發生了什么當在對象上使用clone關鍵字時,。雖然這是不是我們每一天能遇到的,一個漂亮的用例是創建一個真正的單例模式通過添加private訪問修飾符給這個方法。_toString無疑把最好的始終留到最后,_toString方法是一個非常方便的附加方法對于我們的工具包。該方法可以聲明覆蓋對象的行為,當作為一個字符串輸出時,例如,當它被輸出時。如果你想能輸出對象到模板中,你可以使用此方法來控制輸出結果。讓我們再來看看在Penguin類中: 01class Penguin 02 03 public function _construct($name) 04 $this-species = Penguin;05 $this-name = $name;06 07 08 public function _toString() 09 return $this-name . ( . $this-species . )n;10 11在適當的位置,輸出該對象通過調用echo輸出它,如: 1$tux = new Penguin(tux);2ec
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 特殊需求寵物共同撫養權及費用分擔合同
- 新能源汽車關鍵技術合作及知識產權共享協議
- 短視頻電商直播商品選擇與供應鏈解決方案協議
- 微信小程序電商供應鏈金融與倉儲管理聯合合同
- 《文學作品的深邃魅力:課件設計與展示》
- 企業業務流程管理
- 《小學課件:探索宇宙的奧秘》
- 電器知識培訓教材
- 《Lily的產品攝影》課件
- 學生干部能力提升與班級建設專題培訓
- 《民法》全冊精講課件
- 小學語文五年級知識競賽課件
- 護理人員業務技術檔案 模板
- 工藝管道儀表流程圖PID基礎知識入門級培訓課件
- 人音版小學一年級音樂下冊教案 全冊
- 草皮鋪種施工方案
- 中醫養生穴位保健按摩課件
- 回旋鏢運動軌跡的模擬
- 《康復醫學》PPT課件(PPT 105頁)
- (完整)高血壓病歷以及全套臨床病歷
- 標準溶液配制與標定原始記錄(氫氧化鈉)
評論
0/150
提交評論