2009-05-26 3 views
4

私はJavaで例外を使用しましたが、例外をキャッチまたはスローしない限り、メソッドを呼び出すことはできません。PHPを使用する際にすべての例外を考慮することを保証する

私はPHPで似たようなものを探しています。私はPHPがJavaよりもダイナミックであることを認識していますが、それがスローする例外を定義させることさえできませんが、私が得ることができる最も近いものは何ですか?

PHPのDocを使用してメソッドをドキュメント化しています。正しいtry/catchブロックなしでメソッドを呼び出した場合、または正しい@thowsコメントなしで例外がスローされた場合、E_WARNINGをトリガーするものは完璧です。

+0

興味深い質問が、私はあなたのためのソリューションを持っていない、私は怖いです。 –

+1

あなたは運がありません。私はそれをエミュレートする醜い方法を考えることさえできません... –

+0

誰もがいい答えをありがとう。ソースコード(コンパイラ、静的解析ツールなど)上で実行されるスクリプトのようなものが唯一のオプションです。恥。 – thelem

答えて

2

PHP自体で行う方法はありません。 PHPを解析して自分自身で理解しなければなりません。これにはphc pluginと書きます。

1

私はあなたが合理的に非常に近くになるとは思わない、なぜなら言語のコアは何もあなたと働くために何も提供しないからです。せいぜい、パフォーマンスに全く影響を及ぼさない完全なユーザー空間funcall/exception検証メカニズムを作成することになるでしょう。

1

私はあなたの目標を達成することができるとは確信していません。 PHP環境は、関数が何をしているのか、していないのかを分析しません。これは、通常、他の言語のコンパイル時の操作です(私は思います)。私は、あなたがリフレクションを通してそのようなことを見つけることさえできるとは思わない。

例外ベースクラスがfully extendableであるため、スローされる例外を定義できないと言ったときは間違っています。 PHPはデフォルトで例外をスローしませんが、エラーを引き起こします。トリガされたエラーと例外の間には根本的な違いがあります。後者は大抵の場合、ユーザランド構造です。

これはあなたの質問ではありませんが、完全な例外指向の環境に移行する場合は、set_error_handler()を使用して独自のエラーハンドラを作成し、PHPでトリガされたエラーを管理することをお勧めします。それは例外を捨ててください。

+0

>あなたは間違っていますが、例外を定義することはできません。 これは、メソッドのソースを見ずにメソッドによってスローされる例外を知る方法がないことを意味します。 public void myMethod()throws MyException {...} 私が得られる最も近いものは、PHP自身が無視するPHP Docです。 – thelem

+0

ああ、はい、私はあなたが当初誤解していました。ええ、あなたは運が悪いと思うよ。 PHP言語は例外処理を考慮して構築されていません。 – zombat

1

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)

+0

例外が実際にスローされた場合にのみ機能します。例外は比較的めったに投げられないので、実行時に実際にスローされなかったとしても、捕らえられない例外を私に警告する何かを探していました。 – thelem

+0

ええ、これはPHPでやりにくいです... –

関連する問題