0

クラスがありPersonます。

スクリプトにエラー処理を追加したいので、たとえば、ユーザーが間違った電子メール アドレスを入力すると、スクリプトが通知します。通常はまったく問題ありませんが、今はなじみのない領域にいる OO クラスを使用しています。

そう。複数の例外を処理する方法を知りたいと思います。または、コードの各行を一度に 1 行ずつ試して、各行をキャッチする必要がありますか? これは少し過剰に思えます。理想的には、次のことをしたいと思います。

try {
    $people[$new]->set_fullname($_POST['name']);
    $people[$new]->set_active(true);
    $people[$new]->set_add1(rEsc($_POST['add1']));
    $people[$new]->set_add2(rEsc($_POST['add2']));
    $people[$new]->set_add3(rEsc($_POST['add3']));
    $people[$new]->set_add4(rEsc($_POST['add4']));
    $people[$new]->set_postcode(rEsc($_POST['postcode']));
    $people[$new]->set_phone(rEsc($_POST['phone']));
    $people[$new]->set_email(rEsc($_POST['email']));
} catch {
      echo 'Caught exception: ',  $e->getMessage(), "\n";       
}

しかし、私のエラー処理では、どうすれば複数のエラーをキャッチできますか? すべてのエラー メッセージを配列にプッシュし、それぞれを Web ページにうまく表示したいと思います。php.net で確認できる限り、一度に 1 つのエラー メッセージしかキャッチできないようです。

try {} catch {}コードの各行を本当に実行する必要がありますか?

4

4 に答える 4

4

そもそも、これは例外をスローするべきではありません。フィールドをループして、考えられるエラーをいくつかの$errors配列に追加するだけです。

ユーザーがフィールドを台無しにすることは例外的なケースではありません。ユーザーオブジェクトが電子メールアドレスを検証できるべきだとは思いません。それはフォームの責任のようです。

また、そのrEsc機能が何を使用しているのか疑問に思っています。global将来的に他の関数に置き換えることが事実上不可能になる関数を使用しているだけでなく(密結合)、名前の選択も不適切です。また、なぜその場所で何かをエスケープしたいのかわかりませんか(それがそのことだと思います)。データを使用している場合にのみ、データをエスケープ/サニタイズしてください。データベース入力用の場合は、はるかに優れた方法があるため、データをエスケープしているものについて疑問に思っています。

于 2013-03-24T17:55:17.800 に答える
0

これを設計する方法は次のとおりです。

  • すべてのプロパティを検証し、ユーザーにエラーを説明する文字列の配列を返す、Person クラスで validate() メソッドを作成します。エラーがない場合は、メソッドが null を返すようにします。
  • 例外は一切使用しないでください。彼らは遅いです。それらはコードのメンテナンスを複雑にします (そして、これまでに取ったアプローチで症状が見られます)
  • Person オブジェクトのプロパティを設定するためのカスタム メソッドを削除します。PHP は Java ではありません。プロパティを直接設定します。

これをすべてまとめると:

class Person {

    public $name;
    public $address1;
    public $address2;

    public function validate() { }

}

そして、あなたのコード:

$obj = new Person();
$obj->name = "Bob";
$obj->address1 = "1 Elm St.";
$validationResult = $obj->validate();
if ( $validationResult != null) { // there were errors
    print_r($validationResult);
}
于 2013-03-24T23:04:23.890 に答える
0
try {
    $people[$new]->set_fullname($_POST['name']);
    $people[$new]->set_active(true);
    $people[$new]->set_add1(rEsc($_POST['add1']));
    $people[$new]->set_add2(rEsc($_POST['add2']));
    $people[$new]->set_add3(rEsc($_POST['add3']));
    $people[$new]->set_add4(rEsc($_POST['add4']));
    $people[$new]->set_postcode(rEsc($_POST['postcode']));
    $people[$new]->set_phone(rEsc($_POST['phone']));
    $people[$new]->set_email(rEsc($_POST['email']));
} catch (Exception $e) {
      echo 'Caught exception: ',  $e->getMessage(), "\n";       
} catch (EmailFormatException $em) {
      echo 'Caught exception: '. $e->getMessage();
}

そのまま続けるだけ

于 2013-03-24T17:00:23.500 に答える
-3

次のように、配列にエラーを入力するために、ループ内で try/catch を使用して検証が必要なデータを設定する foreach ステートメントを作成できます。

$errors = [];
foreach (['field1', 'field2', ...] as $field) {
    try {
        $method = "set_{$field}";
        $people[$new]->$method(rEsc($_POST[$field]));
    } catch (Exception $e) {
        $errors[] = $e->getMessage();
    }
}
于 2013-03-24T17:33:56.323 に答える