2

これが大きなトピックであることは理解していますが、特に OO PHP でエラーを処理するためのベスト プラクティスの方法に関する大まかなアイデアをいただければ幸いです (ただし、言語の仕様を超える優れたパターンにも関心があります)。これらのクラスとアプリケーションが大規模なものであると仮定しましょう。

また、最も推奨される方法は PHP の例外モデルを利用することであることも認識しており、以下の例がこれにどのように変換されるかを知りたいと思っています。

編集:私が探しているのは、たとえばフォームデータの検証時に生成されたエラー(メソッドの呼び出し方法に関するエラーではない)を処理する最善の方法に関するアイデアです。おそらく、例外モデルはこのユースケースには適していませんEND EDIT

特に、すべてのエラーをすぐに表示/使用する必要があるわけではないことを考えると (同じメソッドで複数の例外をスローできますか?)、ログに記録する必要があるものもあれば (これは別の質問だと思います)、他の依存関係がある場合にのみ関連するものもあります。 true (または false) であり、警告だけの場合もあれば、重大な場合もあれば、ステータス/通知の場合もあります。

私が取っている現在のアプローチは、次のようなものです。

class ClassName()
{
    public MethodName( $data, &$errors )
    {
        $e = [];

        // validate content and perform data handling
        // any errors should be added to the array $e

        if( empty( $e ) ) {
            return $processed_data;
        } else {
            $errors = $e;
            return false;
        }
    }
}

// and then calling:
$method_call = ClassName::MethodName( $data, $errors );

if( $method_call ) // do something with the data/display success message etc.
else // decide what to do with any errors

タール族、

4

1 に答える 1

2

それは本当に依存します。ただし、それを行うための「適切な」オブジェクト指向の方法は、例外を使用することです。すでに多くの異なるタイプの例外が組み込まれており ( http://www.php.net/manual/en/spl.exceptions.phpを参照)、独自に定義することができます ( http://php.net/manual/を参照)。 en/language.exceptions.php )。

それらを使用する方法はこれに似ている可能性があります

function foo($bar)
{
    if(!is_string($bar))
        throw new InvalidArgumentException("String argument expected");

    if(strlen($bar) > 50)
        throw new LengthException("String argument is too long!");
}

次に、コードの呼び出しで、try/catch を使用します。

try {
     foo("hjsdkfjhkvbnsjd");
} catch(LengthException $ex) {
     // Trim the string
} catch (InvalidArgumentException $ex) {
     // Try to recover. Cast or trim or something
} catch (Exception $ex) {
     // We hit an exception we're not explicitly handling.  
     // Gracefully exit
     die($ex->Message);
}

いずれにせよ、メソッドが実際に間違って呼び出された場合、またはメソッドが致命的な方法で失敗した場合にのみ、例外をスローする必要があります。

于 2012-10-11T09:12:06.893 に答える