2

很多时候,在我更多面向 .NET 的同事添加的代码中,我会遇到这样的情况:

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

    $localVariable = null;
    return $ret;
}

设置$localVariable为null有什么好处吗?由于它是一个局部变量(因此无论如何都会超出范围),我认为不是,但如果我错了,请纠正我。

4

7 回答 7

5

您的假设对于 php 和 .NET 都是正确的。

于 2011-09-07T12:35:19.337 回答
3

这里有两件事要考虑:内存管理和防御性编码。

出于内存管理的目的,将事物设置为 null 几乎毫无意义。垃圾收集器可以很好地解决问题,一旦函数退出,一切都会好起来的。对于较小的内存块(如整数),这只会使代码混乱。

但是,出于防御性编码目的,这可能没问题。这个例子很傻,但有时在你的代码中,当你用完它们时将它们设置为 null 是个好主意,这样如果它们稍后在函数中被使用,它就会在程序员面前爆炸(并且立即显而易见),而不是导致难以追踪的错误。

于 2011-09-07T12:39:43.020 回答
1

不,只有在它之后进行更多繁重的处理以释放资源时,它才有用。但unset()无论如何在这种情况下会更有用。

于 2011-09-07T12:35:35.067 回答
1

正如CG所说,您认为这是不必要的是正确的。

但是,如果之后出现更多内存密集型代码,它可能更相关,就像在这个函数中一样:

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

    $localVariable = null;

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

    return $ret;
}

我认为就是为什么大多数人会过早地强制变量超出范围:允许垃圾收集器在需要时回收该空间,并且知道您不会使用它。

PS 这是一个示例,代码的下一部分也占用了内存。另一个例子可能是代码的第二部分需要很长时间才能执行。但是,除非出现这样的情况,否则没有必要通过排除局部变量来增加程序的复杂性。

于 2011-09-07T12:50:14.893 回答
0

不。

相信 PHP 会为您管理这些东西。

于 2011-09-07T12:37:31.577 回答
0

不。

 

如果你需要太自由变量的内存,你最好使用unset().

$localVariable但是,如果是一个大对象或数组,它可能会有所帮助。将其设为 null 将取消链接数据,从而使其下一个被删除。

虽然你不需要做任何这些,因为所有的局部变量都会在函数结束后被释放。

于 2011-09-07T13:04:50.477 回答
0

唯一有意义的情况是,如果您有人学会了用 VBScript 编码。在 VBScript 中,引用计数和清理未使用的内存有很多魔法,所以很多人养成了将事物设置为 null 的习惯(或者在 vbspeak 中什么都没有)。如果您的 .Net 同事自 ASP(而不是 ASP.Net)时代就已经存在,那么他们很可能仍然有这样做的习惯。尽管其他海报是正确的,但在 PHP 和 .Net(VB 或 C#)中它没有任何意义。

于 2011-09-07T13:52:18.730 回答