說明
魔術(shù)方法就是在特定場景下不需要調(diào)用而自動執(zhí)行的方法。因為有魔術(shù)方法,所以我們的類可以寫得很靈活~
__construct #構(gòu)造方法,在類被實例化時自動調(diào)用,一般用于初始化操作; __destruct #析構(gòu)方法,對象被銷毀時自動調(diào)用; __clone() #克隆方法,當對象被克隆時,將會自動調(diào)用 __get($key) #屬性獲取方法,當對象要調(diào)用一個被保護或不存在的屬性時,__get方法就會自動被調(diào)用,并傳入調(diào)用的屬性名稱; __set($key,$val) # 屬性設置方法,當對象設置一個被保護或不存在的屬性時,__set會被執(zhí)行,并傳入要設置的屬性名稱和屬性值,注意這里的設置令對象本身沒有發(fā)生改變,除非更改操作是發(fā)生在__set方法內(nèi);但無論如何,都不可以為對象增加本來就沒有的屬性,只有對已有的屬性進行操作; __isset($key) # 當用isset判斷一個對象是否有這個屬性,并且這個屬性是被保護或者不存在時被自動執(zhí)行,并傳入判斷的屬性名稱; __unset($key) # 同上,當用unset刪除一個對象的保護屬性或未存在的屬性時,自動被執(zhí)行; __isset($key) #__isset方法如果返回一個為true的值時,isset的判斷就會失效,不管本類有沒有其判斷的屬性,isset都會返回真; __call($method,$arguments) # 當對象在調(diào)用一個被保護或不存在的方法時,會自動執(zhí)行,并傳入兩個參數(shù)$method為方法嗎,$arguments為該方法的參數(shù)數(shù)組; __callStatic($method,$arguments) # 當調(diào)用了類當中某個被保護或不存在的靜態(tài)方法時,會自動執(zhí)行,并傳入兩個參數(shù)$method為方法,$arguments為該方法的參數(shù)數(shù)組;注意,是靜態(tài)方法,并且是php5.3新增的魔術(shù)方法; __toString() # 輸出對象引用時自動調(diào)用; __invoke() # $obj = class();$obj()時執(zhí)行該函數(shù) __sleep() # 在類序列化時調(diào)用 __wakeup() # 在類反序列化時調(diào)用
"; } public function __toString(){ echo "hahaha,我是toString"; return $this -> privateProperty; } public function __invoke(){ echo "類被實例為對象后,可以直接當做方法調(diào)用,調(diào)用的就是我~"; } public function func(){ echo "這是一個普通的方法
"; } private function privateFunc(){ echo "這是一個被保護的方法
"; } public function __destruct(){ echo "我是析構(gòu)方法,在對象被銷毀(代碼執(zhí)行完、$obj被賦值為NULL或被unset)時,我會被自動調(diào)用
"; echo "貌似對象被克隆的時候,我也會自動執(zhí)行
"; } public function __clone(){ echo "我是克隆魔術(shù)方法,當對象被clone時,我會被自動執(zhí)行.
"; } public function __get($key){ echo "我是__get方法,當對象調(diào)用一個被保護或不存在的屬性時,我會被執(zhí)行,并傳入調(diào)用的屬性名稱 -> {$key}
"; } public function __set($key , $val){ echo "我是__set方法,當對象設置一個被保護或不存在的屬性時,我會被執(zhí)行,并傳入要設置的屬性名稱->"{$key}"和屬性值->"{$val}";
注意,這里的設置并沒有令對象本身的屬性值發(fā)生改變或增加
"; /* __set方法的使用: 1.利用本方法預留一個接口,有條件的限制類外部操作類內(nèi)部被保護的屬性; 2.框架中一般private一個$data的數(shù)組,用set方法對其增加數(shù)組元素,然后來操作這個數(shù)組; */ } public function __isset($key){ echo "我是__isset方法,當isset判斷對象的被保護或不存在屬性時,我會被執(zhí)行,并傳入被判斷的屬性名稱 ->"{$key}"
注意,本方法如果返回一個為true的值時,isset的判斷就會失效,不管本類有沒有其判斷的屬性 ->"{$key}",都會返回真
"; return true; } public function __unset($key){ echo "我是__unset方法,當unset對象的被保護或不存在屬性時,我會被執(zhí)行,并傳入要被unset的屬性名稱 ->"{$key}"
"; } public function __call($method , $arguments){ echo "我是__call方法,當對象在調(diào)用一個被保護或不存在的方法時,我會被調(diào)用,并傳入兩個參數(shù),$method ----> "{$method}"(方法名); $arguments ---->(參數(shù)數(shù)組)"; print_r($arguments); echo "
"; } public static function __callStatic($method , $arguments){ echo "我是__callStatic方法,當調(diào)用了類當中某個被保護或不存在的靜態(tài)方法時,我會被調(diào)用,并傳入兩個參數(shù),$method ----> "{$method}"(方法名); $arguments ---->(參數(shù)數(shù)組)"; print_r($arguments); echo "注意:只能是類::staticMethod,并且本方法是php5.3版本才更新的"; echo "
"; } } $obj = new magic(); # __invoke $obj(); //5.3以后這樣搞就等于是直接調(diào)用類里面的__invoke()方法 # __toString //如果沒有__toString就會報錯;Object of class magic could not be converted to string //但是有__toString方法的話,不僅toString方法會被調(diào)用,并且還會返回toString中返回的值; echo $obj; # __clone; // $obj1 = clone $obj; #__get($key)獲取保護和不存在的屬性↓↓; $obj->privateProperty; //調(diào)用被保護的屬性; $obj->zxg; //調(diào)用不存在的屬性; #__set($key,$val)設置保護和不存在的屬性↓↓: print_r($obj); echo "
"; $obj->privateProperty = "通過__set方法改變了屬性值;"; $obj->zxg = "xgg"; //未存在的屬性; print_r($obj);//$obj本身沒有發(fā)生改變,除非更改操作是發(fā)生在__set方法內(nèi);但無論如何,都不可以為對象增加屬性,只有對已有的屬性進行操作; echo "
"; #__isset($key)方法的使用 echo isset($obj->jyh) ? "有jyh屬性(事實上是沒有這個屬性的,但__isset方法返回真,其就為真)" : "沒有jyh屬性"; echo "
"; #__unset($key)方法的使用 unset($obj->zxg); #__call($method,$arguments) $obj->privateFunc("arg1" , "arg2" , "arg3"); #__callStatic($method,$arguments) magic::zhouzhou(27 , "pig"); ?>
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/31446.html
摘要:實例化對象里面的所在哪個類就返回哪個類。訪問的是當前類有點像因為其是繼承了的方法,而調(diào)用的。由此可見,他們的區(qū)別只有在繼承中才能體現(xiàn)出來,如果沒有任何繼承,那么這兩者是沒有區(qū)別的。但如果是在靜態(tài)方法內(nèi)本類的話,最好還是用 以static::來調(diào)用,是在運行的那個時刻才執(zhí)行綁定操作; 父類中有個方法是延遲綁定的,在子類::調(diào)用這個方法的時候它又回到調(diào)用的子類開始向上找; exampl...
摘要:簡介是才有的新功能,它是用來導出或提取出關(guān)于類方法屬性參數(shù)等的詳細信息,包括注釋。 簡介 PHP Reflection API是PHP5才有的新功能,它是用來導出或提取出關(guān)于類、方法、屬性、參數(shù)等的詳細信息,包括注釋。 class Reflection { } interface Reflector { } class ReflectionException extends Exce...
摘要:而依賴倒置原則的思想是,上層不應該依賴下層,應依賴接口。上面通過構(gòu)造函數(shù)注入對象的方式,就是最簡單的依賴注入當然注入不僅可以通過構(gòu)造函數(shù)注入,也可以通過屬性注入,上面你可以通過一個來動態(tài)為這個屬性賦值。 依賴倒置和控制反轉(zhuǎn)是一種編程思想,而依賴注入就是通過服務容器實現(xiàn)這種面向接口或者是面向抽象編程的思想 概念理解 依賴倒置原則 依賴倒置是一種軟件設計思想,在傳統(tǒng)軟件中,上層代碼依賴于下...
摘要:可以在任何時候啟用和禁用斷言驗證,因此可以在測試時啟用斷言,而在部署時禁用斷言。會檢查指定的并在結(jié)果為時采取適當?shù)男袆右暥āV械臄嘌韵蚝蠹嬗貌⒃鰪娭暗牡姆椒āK沟迷谏a(chǎn)環(huán)境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。 簡述 編寫代碼時,我們總是會做出一些假設,斷言就是用于在代碼中捕捉這些假設,可以將斷言看作是異常處理的一種高級形式。程序員斷言在程序中的某個特定點該...
摘要:通過生成器來生成關(guān)聯(lián)數(shù)組下面每一行是用分號分割的字段組合,第一個字段將被用作鍵名。正常來說,產(chǎn)生的是一個,它的成員變量與函數(shù)不存在別名引用關(guān)系。關(guān)鍵字在的版本,生成器允許從其他生成器,可迭代對象或數(shù)組通過關(guān)鍵字來生成對應的值輸出 一般你在迭代一組數(shù)據(jù)的時候,需要創(chuàng)建一個數(shù)據(jù),假設數(shù)組很大,則會消耗很大性能,甚至造成內(nèi)存不足。 //Fatal error: Allowed memory ...
閱讀 2295·2021-11-24 10:18
閱讀 2728·2021-11-19 09:59
閱讀 1716·2019-08-30 15:53
閱讀 1193·2019-08-30 15:53
閱讀 1076·2019-08-30 14:19
閱讀 2486·2019-08-30 13:14
閱讀 3020·2019-08-30 13:00
閱讀 1954·2019-08-30 11:11