《PHP學習第十五課:關于類的一些魔術方法》要點:
本文介紹了PHP學習第十五課:關于類的一些魔術方法,希望對您有用。如果有疑問,可以聯系我們。
歡迎參與《PHP學習第十五課:關于類的一些魔術方法》討論,分享您的想法,維易PHP學院為您提供專業教程。
感謝關注PHP學習坊,文章內容由PHP學習坊收集整理,如有錯誤或者疏漏之處,歡迎在評論區指出,也歡迎大家積極評論轉發.小編必要來自你們訂閱、評論的支持,吐槽也好,支持也罷,歡迎大家積極評論.
昨天的內容,就有朋友問小編,父類里面的get 和 set是魔術辦法,這兩個不是,是自定義的辦法,魔術辦法是 __get() 和 __set() , 那么,PHP還有哪些魔術辦法呢?
先說明一下,PHP的魔術辦法都是以__開頭的,所以大家在定義辦法名稱時,盡量不要使用__開頭,除非你的目的就是為了重載現有的魔術辦法.盡量避免引起歧義.
老規矩,今天先說一下PHP魔術辦法有哪些,以及都有什么作用,明天上代碼,實例演示.
PHP中的魔術辦法總結 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone , __autoload
__get( $property ) 當調用一個未定義的屬性時拜訪此方法
__set( $property, $value ) 給一個未定義的屬性賦值時會自動觸發這一個辦法
__isset( $property ) 當在一個未定義的屬性上調用isset()函數時會自動觸發這一個辦法
__unset( $property ) 當在一個未定義的屬性上調用unset()函數時會自動觸發這一個辦法
__call( $method, $arg_array ) 為了避免當調用的辦法不存在時產生錯誤,可以使用 __call() 辦法來避免.該辦法在調用的辦法不存在時會自動調用,程序仍會繼續執行下去.
該辦法有兩個參數,第一個參數 $function_name 會自動接收不存在的辦法名,第二個 $args 則以數組的方式接收不存在辦法的多個參數.
這里的未定義的方法包括沒有權限拜訪的方法,這個魔術方法是很常用的,尤其是在框架之中,,很多地方都是通過__call方法實現一種調用關系的.大家有興趣可以找一個框架看下源代碼.
__autoload 函數,它會在試圖使用尚未被定義的類時自動調用.通過調用此函數,腳本引擎在 PHP 失足失敗前有了最后一個機會加載所需的類.
另外,__autoload辦法提供一種“lazy load”的機制,當第一次需要使用相關類時調用,這樣就不會加載不必要的類.
注意: 在 __autoload 函數中拋出的異常不能被 catch 語句塊捕捉并導致致命錯誤.
__construct 構造辦法,當一個對象創建時自動調用此辦法.PHP在類內部實現一個和類同名的函數,也是構造函數,那么兩者區別是什么?
使用__construct辦法的好處是:在修改類名的時候,不需要關注構造函數名稱的修改,避免了,類名修改,而構造函數名稱為修改的問題.
__destruct 析構辦法,PHP將在對象被銷毀前(即從內存中清除前)調用這個辦法.如果學過c++或者其他面向對象語言的朋友,應該對這個更容易理解一些.
在多數情況下,我們并不需要完全復制一個對象來獲得其中屬性.但有一個情況下確實需要:如果你有一個 GTK 窗口對象,該對象持有窗口相關的資源.你可能會想復制一個新的窗口,堅持所有屬性與原來的窗口相同,但必須是一個新的對象(因為如果不是新的對象,那么一個窗口中的改變就會影響到另一個窗口).還有一種情況:如果對象 A 中保存著對象 B 的引用,當你復制對象 A 時,你想其中使用的對象不再是對象 B 而是 B 的一個副本,那么你必須得到對象 A 的一個副本.
對象復制可以通過 clone 關鍵字來完成(如果可能,這將調用對象的 __clone() 辦法).對象中的 __clone() 辦法不能被直接調用.
當我們調試程序時,需要知道是否得出正確的數據.比如打印一個對象時,看看這個對象都有哪些屬性,其值是什么,如果類定義了toString辦法,就能在測試時,echo打印對象體,對象就會自動調用它所屬類定義的toString辦法,格式化輸出這個對象所包含的數據.如果類沒有實現此辦法,則無法通過echo打印對象,否則會顯示:Catchable fatal error: Object of class test could not be converted to string in
此辦法必須返回一個字符串
串行化的時候用.serialize() 檢查類中是否有魔術名稱 __sleep 的函數.如果這樣,該函數將在任何序列化之前運行.它可以清除對象并應該返回一個包括有該對象中應被序列化的所有變量名的數組.
反串行化的時候調用,unserialize() 檢查具有魔術名稱 __wakeup 的函數的存在.如果存在,此函數可以重建對象可能具有的任何資源.使用 __wakeup 的目的是重建在序列化中可能丟失的任何數據庫連接以及處置其它重新初始化的任務.
當調用var_export()時,這個靜態 辦法會被調用(自PHP 5.1.0起有效).
本辦法的唯一參數是一個數組,其中包含按array(’property’ => value, …)格式排列的類屬性.
當嘗試以調用函數的方式調用一個對象時,__invoke 辦法會被自動調用.辦法雖然有提供,但是小編沒用過,也不建議大家用,實在沒想到適合這個辦法的真實業務場景.
它的原理參照__call(),只不過他是針對靜態辦法的.
以上是本文內容,謝謝年夜家.