




已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
PHP 中的 9 個魔術(shù)方法這個標題有點牽強因為php有不只9種魔術(shù)方法, 但是這些將會引導(dǎo)你使用php魔術(shù)方法一個好的開始。它可能魔幻,但是并不需要魔杖。 這些魔術(shù)方法擁有者特殊的名字,以兩個下劃線開始,表示這些方法在php特定事件下將會被觸發(fā)。這可能聽起來有點自動魔法但是它真的很酷的,我們已經(jīng)看過一個簡單的例子在 last post,即我們使用一個構(gòu)造器-使用這個作為我們第一個例子_construct 構(gòu)造器是一個魔術(shù)方法,當對象被實例化時它會被調(diào)用。在一個類聲明時它常常是第一件做的事但是沒得必要他也像其他任何方法在類中任何地方都可以聲明,構(gòu)造器也能像其他方法樣繼承。如果我們想到以前繼承例子從介紹到oop,我們能添加構(gòu)造方法到Animal 類中,如:1class Animal2 3 public function _construct() 4 $this-created = time();5 $this-logfile_handle = fopen(/tmp/log.txt, w);6 7 8現(xiàn)在我們創(chuàng)建一個類來繼承Animal類 - Penguin類!不添加任何屬性和方法在Penguin類中,我們能申明并定義它繼承自Animal類,如: 1class Penguin extends Animal 2 34 5$tux = new Penguin;6echo $tux-created;如果我們定義一個構(gòu)造方法在Penguin類中,然后Penguin對象將會運行當它被實例化后。由于并沒有構(gòu)造方法,PHP 會參考父類方法定義 信息來使用它因此我們能覆蓋父類方法,或者不,在我們的新類中-很便利。_destruct你發(fā)現(xiàn)文件句柄也是構(gòu)造器一部分嗎?當我們使用完一個對象時真不想把事情放一邊,因此析構(gòu)方法做著與構(gòu)造方法相反的事情。當對象被銷毀時,析構(gòu)方法會運行,或者明確的說當我們不再使用它時,php會為我們清理掉。Animal類中,我們的析構(gòu)方法像這樣,如: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析構(gòu)器讓我們關(guān)閉任何額外的資源比如被使用過的對象。在php中由于我們有這樣運行時間短的腳本(留意在更新的php版本中增強的垃圾回收機制),通常討論內(nèi)存溢出根本不需要。然而它仍是好的推行方法來清理而且總體上讓程序運行起來更高效。 _get這個魔術(shù)方法是一個非常靈巧的小技巧 - 它使實際上不存在的屬性如同存在一半。讓我們舉個小企鵝的例子: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現(xiàn)在,如果我們的小企鵝有一個 name 屬性,而在此之后加載的屬性為 age,那么我們可以這樣處理:1$tux = new Penguin(3);2echo $tux-name . is . $tux-age . years oldn;然而,設(shè)想一下,后端數(shù)據(jù)庫或數(shù)據(jù)供應(yīng)者發(fā)生了改變,name沒有了,變味了username。并且設(shè)想這是一個非常復(fù)雜的應(yīng)用,而需要修改的調(diào)用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這并不是編寫整個系統(tǒng)的好方法,因為它會讓調(diào)試工作變得更困難,但它是一個非常有價值的工具。它允許如同屬性一樣使用或者展示需要經(jīng)過計算的數(shù)據(jù),以及無數(shù)我都想不到的地方。_set那么,我們將所有對 $this-name 的調(diào)用都更改為返回 $this-username的值,那么,如果我們想要設(shè)置這個值呢?也許我們有一個賬戶界面允許用戶修改他們的名字。這時我們就需要 _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這樣,我們就針對大量的調(diào)用偽造對象的屬性,正如我說的,這并不是一個正統(tǒng)的方法,但卻是一個很有用的技巧,值得記住。_call這里有兩種近似的方法,我并沒有單獨列出來,而是一起說明。一個是 _call 方法,如果定義,它將在調(diào)用未定義過的方法時被調(diào)用;另一個是 _callStatic 方法,工作方式與第一個相同,但卻是在調(diào)用未定義的靜態(tài)方法時生效(PHP 5.3 加入).通常我使用 _call 進行友善的錯誤處理,這在需要別人整合調(diào)用你的方法的庫代碼中非常有用。例如,如果一段腳本擁有一個企鵝對象,名為 $penguin ,它包含一個 $penguin-speak() 方法.假設(shè) 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這將捕獲的錯誤并回應(yīng)。在實際應(yīng)用中,更合適的方法是依據(jù)你的需要紀錄消息日志,將用戶重定向,或者拋出一個異常,但概念是相同的。在這里你可以處理任何你需要處理的不當調(diào)用,你可以檢測方法的名稱,并一一處理例如,你可以同上面我們重命名屬性一些樣重命名方法。_sleep_sleep()方法會被調(diào)用當對象被序列化后,并允許你處理序列化。這有各種各樣的程序,一個很好的例子如果一個對象包含某種類型的指針,例如文件句柄或引用另一個對象。當對象被序列化然后解序列化,這些引用類型是無用的,因為這些類型的引用的目標可能不再存在或有效。因此,最好是來取消這些信息在存儲它們之前。_wakeup_wakeup()是與_sleep()方法相反的,允許您更改對象解序列化的行為。和_sleep()一起使用,可以用來恢復(fù)被刪除的句柄和對象當對象被序列化時。一個很好的例子程序是數(shù)據(jù)庫句柄被取消設(shè)置當該項被序列化,然后恢復(fù)到當前配置中設(shè)置項目時,解序列化一個數(shù)據(jù)庫句柄。_clone我們看過一個使用clone關(guān)鍵字的例子,在我的介紹從入門到oop的第二部分,創(chuàng)建對象的副本,而不是有兩個變量指向同一個實際的數(shù)據(jù)。在一個類中重寫此方法,我們可以觀察發(fā)生了什么當在對象上使用clone關(guān)鍵字時,。雖然這是不是我們每一天能遇到的,一個漂亮的用例是創(chuàng)建一個真正的單例模式通過添加private訪問修飾符給這個方法。_toString無疑把最好的始終留到最后,_toString方法是一個非常方便的附加方法對于我們的工具包。該方法可以聲明覆蓋對象的行為,當作為一個字符串輸出時,例如,當它被輸出時。如果你想能輸出對象到模板中,你可以使用此方法來控制輸出結(jié)果。讓我們再來看看在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在適當?shù)奈恢茫敵鲈搶ο笸ㄟ^調(diào)用echo輸出它,如: 1$tux = new Penguin(tux);2ec
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 轉(zhuǎn)運協(xié)議書范本
- 中通快遞倉庫培訓(xùn)體系
- 無租租車協(xié)議書
- 【課件】探討現(xiàn)代企業(yè)培訓(xùn)與員工持續(xù)發(fā)展的重要性
- 人自愿離婚協(xié)議書
- 《嬰幼兒早期教育》課件
- 專有技術(shù)合作協(xié)議與技術(shù)轉(zhuǎn)讓條款說明
- 農(nóng)村牧場畜群托管及護理協(xié)議
- 配送勞務(wù)分包合同協(xié)議
- 退休合同聘用合同協(xié)議
- GB/T 14315-2008電力電纜導(dǎo)體用壓接型銅、鋁接線端子和連接管
- 《民法》全冊精講課件
- 小學語文五年級知識競賽課件
- 護理人員業(yè)務(wù)技術(shù)檔案 模板
- 工藝管道儀表流程圖PID基礎(chǔ)知識入門級培訓(xùn)課件
- 人音版小學一年級音樂下冊教案 全冊
- 草皮鋪種施工方案
- 中醫(yī)養(yǎng)生穴位保健按摩課件
- 回旋鏢運動軌跡的模擬
- (完整)高血壓病歷以及全套臨床病歷
- 標準溶液配制與標定原始記錄(氫氧化鈉)
評論
0/150
提交評論