2

より .NET 指向の同僚によって追加されたコードで、次のような問題に遭遇することがよくあります。

function someFunction()
{
    $localVariable = otherFunction();
    $ret = $localVariable * 2; // or whatever

    $localVariable = null;
    return $ret;
}

$localVariablenullに設定する利点はありますか? これはローカル変数であるため (したがって、とにかく範囲外になります)、そうではないと思いますが、間違っている場合は修正してください。

4

7 に答える 7

5

あなたの仮定は、php と .NET の両方で正しいでしょう。

于 2011-09-07T12:35:19.337 に答える
3

ここで考慮すべき点が 2 つあります。メモリ管理と防御的コーディングです。

メモリ管理の目的で、null に設定することはほとんど無意味です。ガベージ コレクターは問題なく物事を把握でき、関数が終了すればすべて問題ありません。小さいメモリ (整数など) の場合、これはコードを乱雑にするだけです。

ただし、防御的なコーディングの目的では、これで問題ない場合があります。この例はばかげていますが、コードを使い終わったら null に設定することをお勧めします。これにより、後で関数内でそれらが使用された場合、プログラマーの顔に爆発します (そして追跡が困難なバグにつながるのではなく、すぐに明らかです)。

于 2011-09-07T12:39:43.020 に答える
1

CGが言うように、あなたはこれが不必要であると仮定することで正しいです。

ただし、次の関数のように、メモリを大量に消費するコードが後で来る場合は、より適切になる可能性があります。

function someFunction()
{
    $localVariable = new MemoryPiggy();
    $number = $localVariable->calcValue();

    $localVariable = null;

    $localVariable2 = new AnotherMemoryHog($number);
    /*
     * Do stuff with $localVariable2
     */

    return $ret;
}

これが、ほとんどの人が時期尚早に変数をスコープ外に強制する理由だと思います。ガベージコレクターが必要に応じてそのスペースを再利用できるようにし、使用しないことを知っているからです。

PSこれは、コードの次の部分もメモリを消費する例です。別の例として、コードの2番目の部分の実行に長い時間がかかる場合があります。ただし、このような状況を除けば、ローカルを無効にすることでプログラムの複雑さを増す必要はありません。

于 2011-09-07T12:50:14.893 に答える
1

いいえ、リソースを解放するためにその後に重い処理がある場合にのみ役立ちます。しかしunset()、とにかくその場合はもっと便利です。

于 2011-09-07T12:35:35.067 に答える
0

いいえ。

 

自由変数のメモリが必要な場合は、を使用することをお勧めしますunset()

$localVariableただし、が大きなオブジェクトまたは配列である場合は役立つ場合があります。nullにすると、データのリンクが解除され、次に削除されます。

関数が終了するとすべてのローカル変数が解放されるため、これを行う必要はありません。

于 2011-09-07T13:04:50.477 に答える
0

いいえ。

PHP を信頼して、このようなことを管理してください。

于 2011-09-07T12:37:31.577 に答える
0

それが理にかなっている唯一の状況は、VBScript でコーディングを学んだ人がいる場合です。VBScript では、参照カウントと未使用メモリのクリーンアップに関して多くの魔法がありました。そのため、多くの人が、物事を null (または vbspeak では何も設定しない) に設定する習慣を身につけました。ASP (ASP.Net ではない) の時代から .Net の同僚がいる場合、彼らはまだこれを行う習慣がある可能性があります。他のポスターは正しいですが、PHP と .Net (VB または C#) では何の意味もありません。

于 2011-09-07T13:52:18.730 に答える