3

PHP が非常にエラー耐性の高い言語であることは知っています。それが、次のような関数呼び出しに混合変数を使用できる理由だと思います。

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

そのような混合変数を使用しない推奨される方法はありますか?

私自身のプロジェクトでは、後でエラーが発生する問題を減らし、コードを明確にするために、このような混合変数を避けるようにしています。

PHP 7 では、この関数が期待する変数の型を宣言できるはずですよね? これはどのように行われますか?

4

2 に答える 2

2

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

PHP 5 には「型ヒント」があります。

PHP 5.0 以降では、クラス名またはインターフェース名を型ヒントとして使用できます。または、次のようにしますself

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

arrayPHP 5.1 以降では、型ヒントとしても使用できます。

<?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 以降では、スカラー型も使用できます ( intstringbool) float:

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

PHP 7 以降、これはType Declarationと呼ばれるようになりました。

PHP 7 ではReturn Type Declarationsも導入され、関数が返す型を指定できるようになりました。この関数は次を返す必要floatがあります:

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

PHP7 を使用していない場合は、利用可能な型ヒントを使用して、適切なPHPDoc ドキュメントで残りのギャップを埋めることができます。

<?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 など)。

于 2016-05-30T10:14:31.550 に答える
2

これは「意見に基づく」ものとしてクローズされる可能性がありますが、それでも良い質問です。

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

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

次に、「理想的ではない」フォームである複数のことを行っています。

getThingById(int)代わりに、適切な名前のメソッドを 2 つ提供してみませんgetThingByFilters(Filters)getThingLike(string)? コードも読みやすく、予測しやすくなります。

于 2016-05-30T10:34:46.990 に答える