更新時(shí)間:2018-12-26 來(lái)源:黑馬程序員技術(shù)社區(qū) 瀏覽量:
當(dāng)在執(zhí)行代碼操作的過(guò)程中,難免遇到一些錯(cuò)誤性問(wèn)題,比如_call
在提到__call之前,先來(lái)看一個(gè)實(shí)例的測(cè)試結(jié)果,以便更好地去了解__call方法的作用.在調(diào)用對(duì)象中不存在的方法時(shí)就會(huì)出現(xiàn)系統(tǒng)報(bào)錯(cuò),然后程序退出不能繼續(xù)執(zhí)行。如果在類中添加一個(gè)“魔術(shù)”方法__call(),則調(diào)用對(duì)象中不存在的方法時(shí)就會(huì)自動(dòng)調(diào)用該方法,并且程序可以繼續(xù)向下執(zhí)行。
可以通過(guò)在__call()方法中的設(shè)置,提示用戶調(diào)用的方法及需要的參數(shù)列表內(nèi)容不存在。__call()方法需要兩個(gè)參數(shù),第一個(gè)參數(shù)是調(diào)用不存在的方法時(shí),接受這個(gè)不存在的方法的方法名,并將這個(gè)不存在的方法中,使用的參數(shù)列表形成數(shù)組傳給__call()方法中的第二個(gè)參數(shù)。
實(shí)例代碼如下:
//這是一個(gè)測(cè)試的類,里面沒(méi)有屬性和方法 class Test { } //產(chǎn)生一個(gè)Test類的對(duì)象 $test=new Test(); //調(diào)用對(duì)象里不存在的方法 $test->demo("one", "two", "three"); //程序不會(huì)執(zhí)行到這里 echo "this is a test運(yùn)行結(jié)果:Fatal error: Call to undefined method Test::demo()
我們知道,程序的運(yùn)行結(jié)果拋出了錯(cuò)誤提示,在運(yùn)行的過(guò)程中拋出錯(cuò)誤后就已經(jīng)中斷了,以致”$Person->say();“這個(gè)正確的方法也不能再繼續(xù)運(yùn)行??匆幌律厦娴拇a就知道,Person類并沒(méi)有代碼錯(cuò)誤,錯(cuò)就錯(cuò)在實(shí)例化Person類的過(guò)程中調(diào)用了Person類中并不存在的方法,如run()和eat()。
在程序的運(yùn)行中,出現(xiàn)如上拋出的的錯(cuò)誤是致命性的,整個(gè)程序?qū)⒈罎?。為了處理這種錯(cuò)誤的同時(shí)讓程序繼續(xù)執(zhí)行,我們可以在類中添加一個(gè)魔術(shù)方法__call,來(lái)調(diào)用對(duì)象中不存在的方法時(shí)自動(dòng)調(diào)用該方法,并且使程序可以繼續(xù)向下執(zhí)行。
下面將在上面的代碼的基礎(chǔ)上多添加一個(gè)__call方法并調(diào)試,實(shí)例代碼如下:
運(yùn)行結(jié)果:
你所調(diào)用的函數(shù):run(參數(shù):Array ( [0] => teacher ) )不存在!
你所調(diào)用的函數(shù):eat(參數(shù):Array ( [0] => child [1] => apple ) )不存在!
Hello, wblog!
這次程序的運(yùn)行結(jié)果不再拋出致命性錯(cuò)誤,在調(diào)用不存在的方法時(shí)自動(dòng)調(diào)用了__call方法捕捉處理不存在的方法并提示給用戶,而調(diào)用存在的方法時(shí)程序正常執(zhí)行。
總結(jié):在類中添加一個(gè)魔術(shù)方法__call,在調(diào)用對(duì)象中不存在的方法時(shí)就會(huì)自動(dòng)調(diào)用該方法,并且程序可以繼續(xù)向下執(zhí)行。
希望本文所述對(duì)大家的PHP程序設(shè)計(jì)有所幫助。
作者:黑馬程序員PHP+H5全棧培訓(xùn)學(xué)院
首發(fā):http://php.itheima.com/?v2