4

この質問は特にPHPに関するものですが、他の言語にも当てはまるのではないかと思います。

PHP4とPHP5の間で、言語の設計者は-1、戻り値としての使用から、定数または他の形式の出力の使用に移行したことに気づきました。特に刺激的ではないので、これは理にかなっています-1、そして私はこの慣習が混乱につながったと思います。

-1そうは言っても、関数に別のreturnオプションをすばやく追加したい場合は、戻る傾向があり-1、コーディングしている結果を表現するための完全に有効な方法のように思われることがよくあります。

だからここに私の質問があります:

  1. -1PHP5とPHP4の戻り値としての移行に関して、私の観察は一般的に正しいですか?

  2. -1上記の理由を超えて、-1戻り値がコードの明確さに積極的に寄与しない場合、返すことの短所は何ですか?

4

3 に答える 3

6

これは単なる予感ですが、私の経験では、PHPで選択を設計する理由や一貫性はほとんどありません。また、失敗時に戻る関数もたくさんあります。その多くには、強制する他の(有効な)値とFALSEを明示的に区別する必要があるという注記が追加されています。そのような場合、私ははるかに良い戻り値だと思います。FALSEFALSE0-1

もちろん-1、意味のある名前を持ち、にマップされる定数をいつでも返し、定義することができます-1

于 2012-06-17T15:40:01.643 に答える
2

まだ-1を返すPHP関数は、レガシーの理由でそうしていると思います。

不可解な数値コードを返すことを伴わない論理的で合理的なエラー応答がある単純な関数の場合は、それを使用する必要があります。たとえば、、、またはを返すだけnullで、何が起こったかを伝えることができます。ただし、より複雑な関数、特に複数の障害モードを持つ可能性のある関数の場合は、それぞれがタスク全体の小さなチャンクを処理する異なる関数に分割することを検討してください。false0

例外をスローすることもできます。

function doSomething() {
    if (fooFails()) {
        throw new Exception('Foo failed to work properly.');
    } else if (barFails()) {
        throw new Exception('Bar failed this time.');
    }

    return "blahblah";
}

クラスをサブクラス化しExceptionてさらに特異性を提供することもできます。また、try-catchブロックを使用してどのクラスを検出することもできます。一般的には、このようなオブジェクト指向の原則を使用する方が良いと思います。特に、コードを自分のやり方で書いた理由を完全に忘れてから6か月後には、はるかに明確で保守しやすいコードが生成されます。

class FooException extends Exception {
    // nothing else needed here
}

class BarException extends Exception {
    // nothing else needed here
}

function doSomething() {
    if (fooFails()) {
        throw new FooException();
    } else if (barFails()) {
        throw new BarException();
    }

    return "blahblah";
}

次に、次を使用できます。

try {
    $output = doSomething();

} catch (FooException $e) {
    // respond to the FooException case

} catch (BarException $e) {
    // respond to the BarException case

} catch (Exception $e) {
    // respond to any and all other exceptions that might be thrown
}
于 2012-06-17T15:47:23.910 に答える
1

それは好みの問題です。私は個人的に数字を使うのが好きです。彼らは私にとってより良く見えます。

ただし、場合によっては、truefalseを使用する方が望ましい場合もあります。このように:

function isXYZ($a) {
    if (...) return true;
    return false;
}
于 2012-06-17T15:47:36.540 に答える