0

I'm doing some validation now in PHP, and I'm running allot of conditional statements, for example:


if ($this->email->isValid($email))
return false;
if ($this->username->isValid($username))
return false;

ect..

Is there a nice way to do this? Or do I just run ten If statements like the ones above? I can't use switch obviously, but I'm looking for that type of solution..

P.S... I'm using Zend Framework for validation

4

10 に答える 10

4

次のように OR できます。

if(cond1||
   cond2||
   cond3||
   cond4)
{
  return false;
}
于 2009-06-16T09:17:09.753 に答える
3

このようなことを行うことは、保護者条項と呼ばれます。同じ値を返す句をグループ化するように改善できます。

if ($this->email->isValid($email) || $this->username->isValid($username))
{
    return false;
}

または、このように、多くの場合(ifをフォーマットする方法は、読みやすくするためですが、他の方法でも問題ありません)

if (
    $this->email->isValid($email) || 
    $this->username->isValid($username) || 
    $this->somethingelse()
   )
{
    return false;
}
于 2009-06-16T10:58:48.753 に答える
0

私はそれらを私のクラスのデータメンバーにします。明らかに、ここではフォーム駆動型のクラスが必要になります。したがって、ここでは、たとえば、電子メールをクラスにラップし、それらをメンバー変数として持つクラスのコンストラクターで初期化することができます。これで、電子メールラッパークラスは、初期化/構築時に電子メールの検証を行います。

見た目がすっきりしていて、検証や特定のメソッドをemail-wrapperクラスにまとめることができるIMHO。

ある文脈ではそれがスレッジハンマーかもしれないことを私は知っています。賢明に選んでください!

于 2009-06-16T12:30:17.930 に答える
0

次のようにします。

$errlvl = 0;

if($errlvl == 0 && $this->email->isValid($email)){
    $errlvl++;
}

if($errlvl == 0 && $this->username->isValid($username)){
    $errlvl++;
}

// your validation list keeps going

if($errlvl > 0){
    return false;
}

この意志

  1. 前にエラーがあると以下がチェックされないので冗長性を減らします。
  2. リストに追加し続けることができます
  3. 発生したエラーの数を知りたい場合は、ステートメントで $errlvl == 0 を削除できます
于 2009-08-05T11:41:10.313 に答える
0

これがフォームからのデータである場合は、他の質問のポスターで推奨されているように、Zend_Form を見てください。

フォーム要素へのバリデーターの追加を詳述するサンプルコードを投稿しました

于 2009-06-16T09:17:35.773 に答える
0

最も明白な検証を一番上に置くようにしてください。そうすれば、失敗すると、すべてのステートメントを実行する前にトリップします。また、中かっこのない if ステートメントは好きではありませんが、それは単なる意見の問題です。

于 2009-06-16T09:17:49.503 に答える
0
if ($this->email->isValid($email) || 
    $this->username->isValid($username))
        return false;
于 2009-06-16T09:18:04.353 に答える
0

複数のリターンよりもいくつかの変数を使用することは常に良いことです

これらが唯一の返品条件である場合。すべての条件をチェックする必要はありません。true 条件のみをチェックするように、デフォルトで false を返すか、またはその逆です。

$result = false; // デフォルトでは false を返します。

if (cond1 || cond2) { //true を返す条件のみをチェックします。:)

  $result = true;

}

$結果を返します。

乾杯、

-ラトネッシュ

于 2009-06-16T09:26:45.053 に答える
0

すべてのオブジェクトを配列に追加し、それを繰り返します(あなたまたは Zend は、インターフェイス「バリデーター」または各コンポーネント(ユーザー名、電子メールなど)が「isValid」メソッドを実装するようなものを使用していると思います):

$validators = array();
$validators[] = $this->email;
$validators[] = $this->username;

foreach ($validators as $validator)
{
    if (!$validator->isValid())
    {
        return false;
    }
}
于 2009-08-05T14:58:19.313 に答える
0

多分このようなもの:

foreach( $form->getElements as $element => $value )
{ 
    if( !$element->isValid( sanitize($value))){
       return false;
    }
}

ただし、ZF を使用している場合、個々のフィールドではなく 1 つのフィールドですべてのフォームをチェックするため、これはワンライナーの回答です。

$form = new My_Zend_Form(); // in the controller action that you send the form to

if ( $form->isValid($_POST)) {
    // Success /// do whatever you want with the data
    $data = $form->getValues();
} else {
    //error
}
于 2009-06-16T10:18:38.537 に答える