4

例外スロー関数を使用して、php のクラスで引数のチェックを行います。基本的なチェック ( など) を実行し、false で例外をスローする関数があり===ますin_array。だから私はassertNumeric($argument, "\$argument is not numeric.");代わりに行うことができます

if ( ! is_numeric($argument) ) {
    throw new Exception("\$argument is not numeric.");
}

タイピングの手間を省く

assert() に関するphpマニュアルページのコメントを読んでいました

ウィキペディアに記載されているように、「アサーションは主に開発ツールであり、プログラムが一般に公開されると無効になることがよくあります。」「アサーションは、論理的に不可能な状況を文書化し、プログラミング エラーを発見するために使用する必要があります。「不可能」が発生した場合、根本的な何かが明らかに間違っています。これはエラー処理とは異なります。ほとんどのエラー状態は可能ですが、一部のエラー状態は非常に起こりそうにないものもあります。アサーションを汎用のエラー処理メカニズムとして使用することは通常賢明ではありません. アサーションはエラーからの正常な回復を可能にせず, アサーションの失敗はしばしばプログラムの実行を突然停止させます. アサーションはユーザーフレンドリーなエラーも表示しません.メッセージ。"

これは、アサーションを手動で無効にした場合でも、アサーションを強制的に有効にするという "gk at proliberty dot com" のアドバイスは、アサーションを開発ツールとしてのみ使用するというベスト プラクティスに反することを意味します。

それで、私は「間違ったことをしている」のでしょうか?これを行う他の/より良い方法は何ですか?

4

2 に答える 2

1

個人的には、ウィキペディアのコンテンツを優先し、通常の型チェックにアサーションを使用しません。

代わりに、PHP Type-Hinting を使用します (現在、php 5.1 のオブジェクトと php 5.2 の配列に取り組んでいます ... 基本的なデータ型には役立ちませんが、何もないよりはましです)。次に、ヒントを示していた関数を使用するか、もう少し進んで、一般的な型ヒント用の Ilia Alshanetsky のパッチを検討することができます。ここ を参照してください

于 2010-05-11T23:43:02.243 に答える
0

通常のアサーションと同様に、便利なグローバル定数または変数またはクラス コンストラクター メソッドを介して、カスタム アサーションをオフにできるはずです。それらは実際には製品コードに属しておらず (アクティブ)、どの種類のライブラリでもデフォルトでアクティブではありません。それらを使用して行うことについては、それらをオフにすることができたとしても、CPU サイクルの無駄のように思えます。

低レベル言語では、アサーションは、過度に熱心なアーキテクチャ固有のコンパイラ最適化によって作成されたバグなど、非常に奇妙な状況をキャッチするのに非常に役立ちます。たとえば、正常な宇宙では、主張された条件が真になることがわかっています。次に、コンパイラが時空の構造を引き裂き、すべてが変化します。そのため、PHC や Roadsend などを使用してアプリをコンパイルする場合に役立つ可能性があります。

また、すべての関数への入り口がアサーションによって保護されている「過度に安全な」コード (ほとんどが C) も見てきました。私は本当にそれをする知恵に疑問を呈します。

要するに、特にユーザー入力に依存する場合は、コードが停止するだけでなく、正常に失敗するか、まったく失敗しないようにする必要があります。アサーションは、false と評価される条件のみを報告し、エラーを処理しません。

于 2010-05-12T00:06:20.243 に答える