我在Java中使用了異常,就像它不會讓你調用方法,除非你捕獲或拋出它可能拋出的異常。確保在使用PHP時考慮所有異常
我在找尋類似於PHP的東西。我意識到PHP比Java更具動態性,甚至不會讓你定義它拋出的異常,但我能得到的最接近的是什麼?
我們使用PHP Doc記錄了我們的方法,所以如果您調用沒有正確的try/catch塊的方法觸發了E_WARNING,或者拋出了沒有正確的@thows註釋的異常,那將是完美的。
我在Java中使用了異常,就像它不會讓你調用方法,除非你捕獲或拋出它可能拋出的異常。確保在使用PHP時考慮所有異常
我在找尋類似於PHP的東西。我意識到PHP比Java更具動態性,甚至不會讓你定義它拋出的異常,但我能得到的最接近的是什麼?
我們使用PHP Doc記錄了我們的方法,所以如果您調用沒有正確的try/catch塊的方法觸發了E_WARNING,或者拋出了沒有正確的@thows註釋的異常,那將是完美的。
在PHP本身沒有辦法做到這一點。你將不得不解析PHP並自己弄清楚。請嘗試爲此寫入phc plugin。
我不認爲你可以合理地得到非常接近的,因爲語言核心沒有提供任何與你合作的東西。充其量,你最終會創建一些完全用戶空間的funcall /異常驗證機制,這對性能有着絕對可怕的影響。
我不確定您是否可以完成您的既定目標。 PHP環境不分析函數可能做什麼或不可以做什麼,這通常是其他語言的編譯時操作(我認爲)。我不認爲你甚至可以通過反思找到那種東西。
但是,如果您說您無法定義引發的異常,則異常基類爲fully extendable。 PHP默認不會拋出任何異常,但會觸發錯誤。觸發錯誤和異常之間存在根本差異,後者大部分是用戶地構造。
這不是你的問題,但我提出了一個建議,如果你想轉移到一個完全面向異常的環境,你可以使用set_error_handler()編寫自己的錯誤處理程序並管理PHP觸發的錯誤,並且有它拋出一個例外。
我想你可以在PHP中使用異常處理程序和反射來簡單地重現此行爲。
class YourException extends Exception {
public function __toString() {
return __CLASS__;
}
}
class MyObject {
public function __construct(){}
/**
* @throws MyException
*/
public function myMethod() {
return 'foo';
}
}
try {
$o = new MyObject();
$o->myMethod();
}
catch(YourException $e) {
$method = new ReflectionMethod('MyObject', 'myMethod');
$method->getDocComment();
$throws = // Get the @throws comment (foreach, regexp, whatever);
if($e === $throws) {
// do something
}
}
Setting your own exception handler.
Grab and analyse the comments with Reflection mechanism (see getDocComment)
有趣的問題,但我對你沒有辦法解決,我怕。 – 2009-05-26 22:46:26
你運氣不好。我甚至想不出一個醜陋的方式來模擬它... – 2009-05-26 23:29:27
感謝大家的好答案。它看起來像運行在源代碼上的某種形式的腳本(編譯器,靜態分析工具等)是唯一的選擇。恥辱。 – thelem 2009-05-27 08:17:22