2011-01-11 4 views
2

PHPメソッドの引数をどのように検証/管理し、なぜこのようにしますか?PHPメソッドの引数をどのように適用しますか?

+1

「実施する」とはどういう意味ですか?タイプヒントについて話していますか(http://php.net/manual/en/language.oop5.typehinting.php)? – svens

+1

あなたは_validate_を意味すると思います。 – SLaks

+0

どういう意味ですか? –

答えて

16

さて、あなたは型チェックメソッドの引数の話をしている、それが依存していると仮定:

  1. それはオブジェクトを期待していた場合、私はインターフェイスをtype-hintingを使用します。

    public function foo(iBar $bar) 
    
  2. 配列だけが必要な場合は、arrayキーワードでタイプヒントを使用します。

    public function foo(array $bar) 
    
  3. それは、文字列、int型、ブール値またはfloatを期待していた場合、私はそれをキャスト:

    public function foo($bar) { 
        $bar = (int) $bar; 
    } 
    
  4. それが混在期待していた場合、私はちょうどカスケードにチェック:

    public function foo($bar) { 
        if (is_string($bar)) { 
         //handle string case 
        } elseif (is_array($bar)) { 
         //... 
        } else { 
         throw new InvalidArgumentException("invalid type"); 
        } 
    } 
    
  5. 最後に、iterable型が必要な場合は、型ヒントを使用しません。それは、ファイル名またはディレクトリを期待していた場合だけis_fileでそれを確認し、

    public function foo($bar) { 
        if (is_array($bar)) { 
         $bar = new ArrayIterator($bar); 
        } 
        if (!$bar instanceof Traversable) { 
         throw new InvalidArgumentException("Not an Iterator"); 
        } 
    } 
    
  6. :それは最初の配列の場合、私は、その後、再ロードするイテレータをチェック

    public function foo($bar) { 
        if (!is_file($bar)) { 
         throw new InvalidArgumentException("File doesn't exist"); 
        } 
    } 
    

私はと思いますほとんどのケースを処理します。あなたが他のものを考えるなら、私は喜んでそれらに答えようとします...

+0

ありがとう私はこのような例を探していた。 –

2

Typecheckingは生産段階ではなく開発段階で行うべきことです。だから、そのための適切な構文の特徴は次のようになります。

function xyz($a, $b) { 
    assert(is_array($a)); 
    assert(is_scalar($b)); 

私はそれを回避しようと、あるいはできれ型変換を使用しますが。動的に型指定されるPHPは、異なる値に非常によく適合します。基本的な言語の振る舞いをターンダウンしたい場所はほんのわずかです。

+0

有効ですが、大きくはありません。 [assert'のドキュメント](http://us3.php.net/assert)を見て、この抜粋を読んでください: 'アサーションは、入力パラメータチェックのような通常のランタイム操作には使用しないでください。大まかに言えば、アサーションチェックが有効化されていないと、コードは常に正しく動作するはずです。しかし、デバッグだけの場合は、うまくいきます。 – ircmaxell

+1

@ircmaxell:これは、「Typecheckingはあなたがすべきことです生産段階ではなく開発段階で行う。実行時にタイプをチェックする必要がある場合は、より深刻な構造上の問題を推測します。型チェックが治癒する可能性は低い。このことは、開発中に検出する必要があります(これは厳密に型指定された言語のコンパイル段階によく似ています)。だから、実際にはデバッグやユニットテストの長い腕に数えられるはずです。 – mario

関連する問題