コアポイント:
防御プログラミングの定義:
防御プログラミングは、簡単に言えば、潜在的な障害ポイントを予測する目的でプログラムすることです。目標は、これらの問題が発生する前に回避することです。多くの人々は防御的なプログラミングに反対しますが、これは多くの場合、彼らが見る防御的なプログラミング方法のいくつかが原因です。防御プログラミングは、テスト駆動型の開発を避けたり、単に障害を修正する方法と見なされるべきではありません。
「高速失敗」は、防御プログラミングの反対と見なされるべきではありません。どちらも同じカテゴリに属します。プログラムの障害の可能性を予測し、これらの障害を防止または適切に処理しない場合、これらの方法は何ですか?
速く速く、エラーを大声で報告します
単純に言うと、「迅速に失敗し、エラーが大声で報告された」とは、エラーが発生すると、できるだけ早く発生し、エラー状態で静かに実行し続けるのではなく、関係者に警告することを意味します。問題。このメソッドは、スクリプト、モジュール、またはシステムの外側(APIを介して)からのユーザー入力または入力を処理する場合に最も役立ちます。アプリケーションシナリオの1つは、関数に渡された無効な値またはデータ型を確認することです。
一部のプログラマーが「高速障害」メソッドを使用するエラーの1つは、それらを適切に処理する準備をせずにユーザーに例外とエラーを投げるだけです。エラーメッセージに平均的なユーザーが心配または混乱することを望んでいません。さらに重要なことは、悪意のあるユーザーが表示されている情報から何かを学ぶことを望まないことです。ユーザーに有用なメッセージを表示し、エラーを記録し、その例外の結果である必要がある他のタスクを実行します。あなたはただ
function thisTestFunction($testInt) { if (!is_int($testInt)) { // 执行某些操作 } }
の失敗を望んでいません、あなたはまたloud (問題があることを知っている)とセキュリティが必要です(悪い例外処理や例外の完全な欠如があります取り扱いはより多くのセキュリティの問題を引き起こします)。
入力検証ユーザー入力を安全に検証する方法はたくさんあります。
タイプ変換は、ユーザー入力を「検証」する興味深い方法です。時々それは次のようになります:
function thisTestFunction($testInt) { if (!is_int($testInt)) { // 执行某些操作 } }
他の方法を使用してクロスサイトのスクリプト攻撃を避ける代わりに、単にキャプチャ、タイプ変換、および値を割り当てます。これは、予想されるタイプがあり、そのタイプの値が安全である場合にのみ機能します(それ以外の場合は、適切な整数値を確認する必要があります)。このアプローチの問題は(ほとんどの場合)、filter_input()
$member->property = (int)$_GET['property'];
filter_input
これは、シンプルで、しばしば守備的なプログラミングの原則です。比較方法に簡単な変更を加えることは、大きな影響を与える可能性があります。次の状況を考慮してください:
これは比較的正常な比較ですよね?しかし、「==」の代わりに「=」を誤って使用するとどうなりますか(または、ほとんどの場合、「==」)?キーボードの指のシンプルなスワイプ?忘れっぽい、多分?突然、あなたの比較は常に、すべての場合に真実です。あなたのIDEがあなたにこれを警告しない限り、あなたがそれを発見するのにどれくらい時間がかかりますか?場合によっては、これはしばらくの間、サイレントエラーになる可能性があります。ただし、これを防ぐための非常に簡単な方法があります。
$member->property = filter_input(INPUT_GET, 'property', FILTER_VALIDATE_INT); if (false === $member->property) { throw new Exception('Property was not an int'); }
今、誤って等しい符号を使用している場合、エラーは沈黙しません。明らかに、これは頻繁には発生しない可能性があります。テストによって軽減される可能性があり、すべての場合、特に可変性と変動の比較を行う場合は実用的ではありません。しかし、もしあなたが起こる傾向があるなら、これはまだ悪い考えではありません。
if ($member->property == 12345) { // 执行很酷的操作 } else { // 不执行任何有趣的操作 }
トライ/キャッチと例外を処理します
Try/Catchステートメントは、PHP開発者の間の別のホットトピックです。まず、私たちが議論していることを簡単に見てみましょう。
防御プログラミングのためのよく知られているツールは、Try/Catchステートメントと例外クラスです。正しく使用すると、エラーをキャッチしてログに記録するのに最適です。優れたプログラマーは、Try/Catchステートメントを使用して、通常のプロセスの中断を引き起こす可能性のあるエラーまたはその他の状況を予測します。これらの例外が発生した場合、適切な方法で処理する必要があります。必要に応じて、アプリケーションのユーザーは、機密情報を漏らすことなく、可能な限り便利な合理的なエラーメッセージを受信する必要があります。アプリケーションの管理者は、詳細なアラートやログを受信する必要があります。未処理または無視された例外は、「エラーを大声で報告する」という提案を無視し、プログラムが自然界で一定期間サイレントエラー状態になることを可能にする可能性があります。これは、関係者にとっては良くありません。
if (12345 == $member->property) { // 执行很酷的操作 } else { // 不执行任何有趣的操作 }
business トランザクションは、クエリをグループ化できるようにするデータベースの機能であり、1つのクエリが失敗した場合、すべてのクエリが失敗するようにします。これは酸の実装であり、こちらについて詳しく読むことができます。アイデアは、複数のクエリを1つのプロセスに組み合わせることは、特にクエリが相互依存している場合、より安全で安定したソリューションになる場合があるということです。 PHP開発者は、多くの場合、トランザクションを完全に無視したり、不要であると仮定したりしますが、一部の防御プログラミングは、データベースと対話するときに大いに役立つ可能性があります。この記事では、トランザクションがより深く説明されていますが、要するに、トランザクションでは、MySQLの更新を実行してから、実際のが
をコミットする前に結果を確認することができます。 PDOを使用している場合(必要です)、PDOメソッドを使用してトランザクションを開始し、結果をコミットし、ロールバックできます。上記のトランザクションの概要に加えて、この詳細なガイドを通じてさらに研究することができます。
結論これらはいくつかの一般的なトリックです。明らかに、それぞれにその目的があり、それぞれに適用されないという重要な状況があります。しかし、これらの概念を日常の開発体制に組み込むと、仕事の効率を高めることができます。これは通常、現在PHPを学習している開発者により適したトピックですが、誰にとっても、実践の良いレビューです。
特に新しい開発者にとって、覚えていることが1つしかない場合、防御プログラミングを行う必要があるということです。これは、間違っている可能性があります。それらを適切に処理します。サイレントエラーが発生し続けないでください。すぐに失敗しました。コードをテストします。問題をテストおよび解決する堅牢なアプリケーションを構築し、将来の問題を予測および処理することにより、アプリケーションをより信頼性を高め、舞台裏でより良いユーザーエクスペリエンスを作成するのに役立つことができます。以上がPHPでの防御プログラミングのためのその他のヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。