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