《PHP初體驗(yàn)(二)》要點(diǎn):
本文介紹了PHP初體驗(yàn)(二),希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
這是《PHP初體驗(yàn)》內(nèi)容第后半部門,前半部門請(qǐng)查我們的頭條號(hào).
PHP中的反射機(jī)制
反射,直觀的理解就是根據(jù)到達(dá)地找到出發(fā)地和來源.比如給出一個(gè)對(duì)象就可以找到對(duì)象所屬的類、擁有哪些辦法.反射可以在PHP運(yùn)行狀態(tài)中,擴(kuò)展分析PHP程序,導(dǎo)出或提取出關(guān)于類、辦法、屬性、參數(shù)等的詳細(xì)信息,這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象辦法的功能稱為反射API.
如上代碼中介紹的是通過對(duì)象獲取類的辦法和屬性字段,而反射不僅僅可以用于類和對(duì)象,還可以用于函數(shù)、擴(kuò)展模塊、異常等.既然反射可以探知類的內(nèi)部結(jié)構(gòu),那么就可以利用反射機(jī)制實(shí)現(xiàn)插件的功能,也可以利用反射機(jī)制實(shí)現(xiàn)動(dòng)態(tài)代理.接下來舉個(gè)簡(jiǎn)單的例子看看如何通過反射機(jī)制實(shí)現(xiàn)動(dòng)態(tài)代理.
如上的代碼中真正實(shí)現(xiàn)sayHello()動(dòng)作的是Person類中的sayHello()辦法,而Dynamicproxy僅是一個(gè)代理類,其中并沒有定義sayHello()辦法,而是通過__call()辦法動(dòng)態(tài)調(diào)用類Person的sayHello()辦法.在DynamicProxy類中可以做sayHello()辦法的前后攔截,并且可以動(dòng)態(tài)的改變類中的辦法和屬性.很多時(shí)候,善用反射可以保持代碼的優(yōu)雅和簡(jiǎn)潔,但反射也會(huì)破壞類的封裝性,因?yàn)榉瓷淇梢允贡静粦?yīng)該暴露的辦法或?qū)傩员粡?qiáng)制暴露了出來.
PHP中的異常和差錯(cuò)
在語(yǔ)言級(jí)別通常有許多錯(cuò)誤處理模式,但這些模式往往建立在約定俗稱的基礎(chǔ)上,也就是錯(cuò)誤都是可預(yù)知的.不同的語(yǔ)言對(duì)異常和錯(cuò)誤的定義也是不一樣的,在PHP中,遇到任何自身錯(cuò)誤都會(huì)觸發(fā)一個(gè)錯(cuò)誤,而不是拋出異常.也就是說PHP一旦遇到非正常代碼,通常都會(huì)觸發(fā)錯(cuò)誤,而不是拋出異常.因此如果想使用異常處理不可預(yù)料的問題,是辦不到的.好比,想在文件不存在或數(shù)據(jù)庫(kù)無法建立連接時(shí)觸發(fā)異常,是不可行的.PHP會(huì)把這些作為錯(cuò)誤拋出,而不是作為異常捕獲.還是回到PHP的錯(cuò)誤處理上,PHP中的錯(cuò)誤級(jí)別大致分為以下幾類:
最高級(jí)其余錯(cuò)誤是語(yǔ)法解析錯(cuò)誤 prase error.該錯(cuò)誤屬于語(yǔ)法檢查階段錯(cuò)誤,這會(huì)導(dǎo)致PHP代碼無法通過語(yǔ)法檢查.
次之的差錯(cuò)是fetal error.該類差錯(cuò)會(huì)導(dǎo)致PHP流程終止,其后的代碼無法繼續(xù)執(zhí)行.
warning是警告級(jí)其余錯(cuò)誤,在語(yǔ)法中出現(xiàn)很不恰當(dāng)?shù)那闆r才會(huì)報(bào)此錯(cuò)誤,如參數(shù)不匹配、除數(shù)為0等.這種錯(cuò)誤會(huì)導(dǎo)致不可預(yù)期的結(jié)果.
notice是通知級(jí)其余錯(cuò)誤,這種錯(cuò)誤是在如變量使用前未定義、數(shù)組索引是字符時(shí)沒有加引號(hào)等情況.
最低級(jí)別的錯(cuò)誤是deprecated的錯(cuò)誤,表示不保舉,不建議.如在PHP5中使用ereg系列的正則匹配函數(shù)就會(huì)報(bào)此類錯(cuò)誤,該錯(cuò)誤是由于使用了不保舉、過時(shí)的函數(shù)或語(yǔ)法造成的,不影響PHP正常流程.
接下來我們看一看針對(duì)上邊介紹的各個(gè)級(jí)其余錯(cuò)誤PHP是如何處理的.PHP中提供了set_error_handler()函數(shù)來處理錯(cuò)誤,當(dāng)然該函數(shù)也不是可以托管所有種類的錯(cuò)誤,如E_ERROR、E_PARSE、E_CORE_ERROR等錯(cuò)誤,這些錯(cuò)誤會(huì)以原始的方式顯示.當(dāng)然也可以通過restore_error_handler()取消接管:
如上這種“曲折迂回”的處理方式也存在問題:必須依靠程序員本身來掌控對(duì)異常的處理,對(duì)于異常高發(fā)區(qū)、敏感區(qū),如果處理不好就會(huì)出現(xiàn)業(yè)務(wù)數(shù)據(jù)不一致的問題,但是優(yōu)點(diǎn)就是可以獲得程序運(yùn)行的上下文信息,以進(jìn)行針對(duì)性補(bǔ)救.
對(duì)于代碼中存在的異常,必要認(rèn)為的進(jìn)行拋出,接下來我們通過自定義一個(gè)異常類來處理拋出的異常,
初體驗(yàn)就為年夜家介紹到這里吧,以后有機(jī)會(huì)在深入的去了解PHP函數(shù)、PHP與網(wǎng)絡(luò)、PHP與數(shù)據(jù)庫(kù)等等的內(nèi)容吧.
IT行業(yè)最新資訊:
優(yōu)待業(yè)500萬陽(yáng)光待業(yè)基金:
http://www.ujiuye.com/zt/jyfc/?wt.bd=fq37300
優(yōu)待業(yè)官網(wǎng):http://www.ujiuye.com/?wt.bd=fq37300
維易PHP培訓(xùn)學(xué)院每天發(fā)布《PHP初體驗(yàn)(二)》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/6909.html