萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> php面向對象__call處理錯誤調用技巧

php面向對象__call處理錯誤調用技巧

本文章來給大家介紹一下關於在php面向對象__call處理錯誤調用技巧吧,call在以前很少用,今天就來給大家測試一下。


在提到__call之前,先來看一個實例的測試結果,以便更好地去了解__call方法的作用。上代碼:

在調用對象中不存在的方法時就會出現系統報錯,然後程序退出不能繼續執行。如果在類中添加一個“魔術”方法__call(),則調用對象中不存在的方法時就會自動調用該方法,並且程序可以繼續向下執行。可以通過在__call()方法中的設置,提示用戶調用的方法及需要的參數列表內容不存在。__call()方法需要兩個參數,第一個參數是調用不存在的方法時,接受這個不存在的方法的方法名,並將這個不存在的方法中,使用的參數列表形成數組傳給__call()方法中的第二個參數。

代碼

 代碼如下 復制代碼

 <?php

    //這是一個測試的類,裡面沒有屬性和方法
    class Test
    {
    }


    //產生一個Test類的對象

    $test=new Test();


    //調用對象裡不存在的方法

    $test->demo("one", "two", "three");


    //程序不會執行到這裡

    echo "this is a test<br>";


?>

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

我們知道,程序的運行結果拋出了錯誤提示,在運行的過程中拋出錯誤後就已經中斷了,以致”$Person->say();“這個正確的方法也不能再繼續運行。看一下上面的代碼就知道,Person類並沒有代碼錯誤,錯就錯在實例化Person類的過程中調用了Person類中並不存在的方法,如run()和eat()。

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

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

 代碼如下 復制代碼

 <?php

    //這是一個測試的類,裡面沒有屬性和方法
    class Test
    {

        //調用不存的方法時自動調用的方法,第一個參數為方法名,第二個參數是數組參數

        function __call($function_name, $args)
        { 

            print "你所調用的函數:$function_name(參數:"; 

            print_r($args); 

            echo "不存在!<br>n";

        }

    }


    //產生一個Test類的對象

    $test=new Test();


    //調用對象裡不存在的方法

    $test->demo("one", "two", "three");


    //程序不會退出可以執行到這裡

    echo "this is a test<br>";

?>

運行結果:

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

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

Hello, wblog!

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


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

copyright © 萬盛學電腦網 all rights reserved