首頁技術文章正文

當遇到php面向對象call處理錯誤的小技巧

更新時間:2018-12-26 來源:黑馬程序員技術社區(qū) 瀏覽量:

當在執(zhí)行代碼操作的過程中,難免遇到一些錯誤性問題,比如_call
在提到__call之前,先來看一個實例的測試結果,以便更好地去了解__call方法的作用.在調用對象中不存在的方法時就會出現(xiàn)系統(tǒng)報錯,然后程序退出不能繼續(xù)執(zhí)行。如果在類中添加一個“魔術”方法__call(),則調用對象中不存在的方法時就會自動調用該方法,并且程序可以繼續(xù)向下執(zhí)行。

可以通過在__call()方法中的設置,提示用戶調用的方法及需要的參數(shù)列表內(nèi)容不存在。__call()方法需要兩個參數(shù),第一個參數(shù)是調用不存在的方法時,接受這個不存在的方法的方法名,并將這個不存在的方法中,使用的參數(shù)列表形成數(shù)組傳給__call()方法中的第二個參數(shù)。

實例代碼如下:

    //這是一個測試的類,里面沒有屬性和方法    class Test    {    }    //產(chǎn)生一個Test類的對象    $test=new Test();    //調用對象里不存在的方法    $test->demo("one", "two", "three");    //程序不會執(zhí)行到這里    echo "this is a test
";?>

運行結果:Fatal error: Call to undefined method Test::demo()

我們知道,程序的運行結果拋出了錯誤提示,在運行的過程中拋出錯誤后就已經(jīng)中斷了,以致”$Person->say();“這個正確的方法也不能再繼續(xù)運行??匆幌律厦娴拇a就知道,Person類并沒有代碼錯誤,錯就錯在實例化Person類的過程中調用了Person類中并不存在的方法,如run()和eat()。

在程序的運行中,出現(xiàn)如上拋出的的錯誤是致命性的,整個程序將崩潰。為了處理這種錯誤的同時讓程序繼續(xù)執(zhí)行,我們可以在類中添加一個魔術方法__call,來調用對象中不存在的方法時自動調用該方法,并且使程序可以繼續(xù)向下執(zhí)行。

下面將在上面的代碼的基礎上多添加一個__call方法并調試,實例代碼如下:

 

1545807794200_22.jpg

運行結果:

你所調用的函數(shù):run(參數(shù):Array ( [0] => teacher ) )不存在!

你所調用的函數(shù):eat(參數(shù):Array ( [0] => child [1] => apple ) )不存在!

Hello, wblog!

這次程序的運行結果不再拋出致命性錯誤,在調用不存在的方法時自動調用了__call方法捕捉處理不存在的方法并提示給用戶,而調用存在的方法時程序正常執(zhí)行。

總結:在類中添加一個魔術方法__call,在調用對象中不存在的方法時就會自動調用該方法,并且程序可以繼續(xù)向下執(zhí)行。

希望本文所述對大家的PHP程序設計有所幫助。
作者:黑馬程序員PHP+H5全棧培訓學院    
首發(fā):http://php.itheima.com/?v2

分享到:
在線咨詢 我要報名
和我們在線交談!