2013-08-19 47 views
0

我正在學習使用PHP進行一些更高級的編程。向「未定義方法調用」錯誤提供被調用者響應?

我見過調用一個不存在的方法會產生「調用未定義的方法」錯誤。

PHP是相當靈活的是有一種技術,可以攔截這個錯誤?如果是這樣,通常如何完成?

編輯:爲了澄清,我想實際上做一些事情時發生錯誤發送迴應回來,不一定阻止它。忘記提及這是在一個班級的背景下。當然,方法只是在類的環境中應用;)

+1

你可能想看看這個,它也包含致命錯誤:http://stackoverflow.com/a/2146171/1125956。例如,您可以將錯誤記錄在關機功能中,並且用戶重定向到錯誤頁面。 –

+0

@SteAp這不是關於預防,而是關於實際發生錯誤時做些什麼。說發送一個友好的消息回到調用者說,發生了什麼事。可以在框架中有用。 –

+0

@SteAp只是通過鏈接快速瀏覽。它開始於「有什麼方法可以忽略功能......」。絕對不是我想要的。雖然會注意到答案。 –

回答

1

是的,這是不可能捕獲調用的使用魔術方法類未定義的方法:

您需要實現__call()和/或__callStatic()方法如定義爲here

假設你有一個簡單的類CCalculationHelper只有幾個方法:

class CCalculationHelper { 

    static public function add($op1, $op2) { 

    assert( is_numeric($op1)); 
    assert( is_numeric($op2)); 

    return ($op1 + $op2); 

    } 

    static public function diff($op1, $op2) { 

    assert( is_numeric($op1)); 
    assert( is_numeric($op2)); 

    return ($op1 - $op2); 

    } 

} 

在稍後的時間點,你需要通過乘法或除法加強這方面的課。而不是使用兩個顯式方法,你可以使用一個神奇的方法,它實現了兩個操作:

class CCalculationHelper { 

    /** As of PHP 5.3.0 */ 
    static public function __callStatic($calledStaticMethodName, $arguments) { 

    assert(2 == count($arguments )); 
    assert(is_numeric($arguments[ 0 ])); 
    assert(is_numeric($arguments[ 1 ])); 

    switch($calledStaticMethodName) { 

     case 'mult': 
      return $arguments[ 0 ] * $arguments[ 1 ]; 
      break; 

     case 'div': 
      return $arguments[ 0 ]/$arguments[ 1 ]; 
      break; 

    } 

    $msg = 'Sorry, static method "' . $calledStaticMethodName . '" not defined in class "' . __CLASS__ . '"'; 
    throw new Exception($msg, -1); 

    } 

    ... rest as before... 

} 

調用它像這樣:

$result = CCalculationHelper::mult(12, 15); 
+0

對。所以有可能接到電話併發送回復?也許使用某種回調模式。 –

+1

@JamesPoulson是的,這絕對有可能。我已經加強了我的回答。 – SteAp

1

如果你的意思是如何攔截不存在的方法,在您的自定義類,你可以做這樣的事情

<?php 
    class CustomObject { 
     public function __call($name, $arguments) { 
      echo "You are calling this function: " . 
      $name . "(" . implode(', ', $arguments) . ")"; 
     } 
    } 

    $obj = new CustomObject(); 
    $obj->HelloWorld("I love you"); 
?> 

或者,如果你想攔截所有錯誤

function error_handler($errno, $errstr, $errfile, $errline) { 
    // handle error here. 
    return true; 
} 
set_error_handler("error_handler"); 
+0

哎呀。沒有提到我正在談論關於類,所以感謝給這個想法。是的,第一種可能性是我所感興趣的。我認爲error_handler和攔截未捕獲的異常是一樣的。不要以爲我可以按照預期使用它。 –

1

看到你怎麼不希望從這些致命的錯誤中恢復,你可以使用一個關機處理程序:

function on_shutdown() 
{ 
    if (($last_error = error_get_last()) { 
     // uh oh, an error occurred, do last minute stuff 
    } 
} 

register_shutdown_function('on_shutdown'); 

的函數被調用你的腳本的末尾,無論是否發生錯誤;致電error_get_last()以確定。

+0

絕對可以使用這個。我意識到我的問題可能看起來很模糊,以便解釋我希望應用程序能夠在不存在的方法上進行調用時恢復的內容。例如說一個被調用者期待JSON響應的情況。不能有一個異常和錯誤也會搞砸事件,所​​以理想情況下,可以發送一個標準化的響應來簡單地說,「不直觀的方法。檢查應用程序配置。」 –

+1

@JamesPoulson然後你可以使用繼承,並讓父類負責處理'__call()'。 –

+0

這是一個好主意:)。在抽象類或類似的東西中有一個標準方法模板模式。是的,'__call()'似乎適合這裏。 –

相關問題