2016-05-30 6 views
3

私はPHPは非常にエラー耐性の言語で知っていると私はあなたのような機能のためにmixed variables呼び出しを持つことができる理由があると思います:混合変数なしの関数呼び出しの利点は何ですか?

/** 
* @param mixed $bar 
**/ 
function foo($bar) { 
    // Do something with $bar, but check it's type! 
} 

は、このような混合変数を使用してませの推奨方法はありますか?

私自身のプロジェクトでは、このような混在変数を避けようとしています。後でエラーが発生することが少なく、コードの分かりやすさが向上します。

PHP 7では、この関数が期待している変数の型を宣言することはできますか?これはどうですか?

+0

関数foo(array $ bar){// $ barは配列} – vijaykumar

+0

@vijaykumarに関数を追加できますが、これはPHP 7でのみ正しく動作しますか? – Jurik

+0

タイプチェックは、さまざまな理由からうまくいきます。また、手動ではなくインタープリタを使用して、いつでも最高の状態にすることができます。しかし、コードは、強い型付けよりも混合変数でより洗練されたものになる場合が常に存在します。 – Kittsil

答えて

2

これは「意見に基づいて」いると思われがちですが、それでも良い質問です。

関数は1つのことを行う必要があります。あなたがこれを行う必要がある場合:

if it's a string 
    do this 
else if it's a Foo object 
    do this other thing 

をそれからそれはフォーム「理想未満」である以上、一つのことを、やっています。

代わりに2つの名前のついたメソッドを用意してください。たとえば、getThingById(int)getThingByFilters(Filters)またはgetThingLike(string)などですか?コードを読みやすく、予測可能にします。

+0

良質なコードの場合は、これを意見に基づく質問として見ることはできません。もちろん、良いコードと悪いコードは同じ正しい結果を出力することができますが、多くの利点があります。 – Jurik

+0

関数は1つのことを行うべきだと誰が言っていますか?私はそれが本当の答えだと思います。 – Jurik

+0

ボブ・マーティンはおそらく、クリーン・コード(それについては彼の本を読んだ:それは金だ)に対して、それについて言いたいことがあるだろうが、それはちょうど「受け入れられた知恵」だと思う?私はたくさんの人々がそれを唱えていると聞いています(私はいつも私がコードを見ている時にそうします)、それに対抗する合理的なケースを提示している人を聞いたり、読んだことは一度もありません。もちろん、すべてが "それに依存する"と評価されるべきですが、ここの質問では正しいアドバイスだと思います。あなたはしませんか? –

2

これはすぐに意見の問題になるかもしれませんが、私は緩いタイピングがバグの発生の可能性を増やすと感じています。適切である場合もありますが、一般的には、信頼性と保守性が必要なコード(「柔軟性」を超える可能性があります)では厳密な型指定が安全です。

PHP 5.0の時点で、あなたは型ヒントとして、クラスやインタフェースの名前を使用することができ、またはself::、することができますPHP 5.1のよう

<?php 
function testFunction(User $user) { 
    // `$user` must be a User() object. 
} 

PHP 5は、 "タイプヒンティング" を持っていますまた、タイプのヒントとしてarrayを使用します。

<?php 
function getSortedArray(array $array) { 
    // $user must be an array 
} 

PHP 5.4は、機能/閉鎖のためのcallableを追加します。

<?php 
function openWithCallback(callable $callback) { 
    // $callback must be an callable/function 
} 

、PHP 7.0のようにスカラー型は(intstringboolfloat)も同様に使用することができる:PHP 7のよう

<?php 
function addToLedger(string $item, int $quantity, bool $confirmed, float $price) { 
    ... 
} 

、これは現在Type Declaration呼ばれます。

PHP 7では、Return Type Declarationsも導入されており、関数が返す型を指定することができます。この関数floatを返す必要があります。

<?php 
function sum($a, $b): float { 
    return $a + $b; 
} 

あなたが利用可能なタイプのヒントを使用し、適切なPHPDoc documentationで、残りのギャップを埋めることができ、PHP7を使用していない場合:

<?php 

/** 
* Generates a random string of the specified length, composed of upper- 
* and lower-case letters and numbers. 
* 
* @param int $length Number of characters to return. 
* @return string Random string of $length characters. 
*/ 
public function generateRandomString($length) 
{ 
    // ... 

    return $randomString; 
} 

多くのエディタがこれらのコメントを解析し、不適切な入力について警告します(たとえば、PHPStorm)。

+0

厳密な型指定はコードをバグにも開き、違うバグだけを開きます。 ESAにArianne 5ロケット、Flight 501、64ビット浮動小数点から16ビット符号付き整数への変換についてお問い合わせください。 –

+0

私はそれに同意します。しかし、それほどPHPではあまり意味がありません。タイプはシンプルです。サイズはありません。 – Will

関連する問題