没有用吗?

时间:2013-08-08 20:24:40

标签: php

我从来没有见过有人使用unset我想知道这是否可以节省一些东西,或者是否完全浪费时间和代码?

<?php
$message = "Line 1\r\nLine 2\r\nLine 3";
mail('admin@example.com', 'My Subject', $message);

/* IS THERE ANY REASON TO UNSET $message ? */
unset($message);
?>

6 个答案:

答案 0 :(得分:6)

取决于。

如果您正在开发一个长期运行的守护程序或作业,unset()可用于将内存保持在合理的范围内:以帮助防止泄漏。

如果您正在为Web应用程序开发页面/脚本,unset()对内存管理并不是非常有用。

的情况下,如果您依赖array并且需要删除值,那么它非常有用。一个愚蠢的例子,也许......但是考虑这样的事情:

$users = getUsers($someCondition);
foreach ($users as $k => $v) {
  unset($users[$k]['password_hash']);
}
print json_encode($users);

在你给出的具体例子中,它没用:

<?php
$message = "Line 1\r\nLine 2\r\nLine 3";
mail('admin@example.com', 'My Subject', $message);

// PHP is about to clean everything up anyway ... don't bother doing this:
unset($message);
?>

答案 1 :(得分:4)

通过引用传递foreach $value时,$value在循环完成后仍在范围内。用unset()停止这种疯狂。

foreach($array as &$value)
{
    $value = "something else"
}

var_dump($value);
// string(5) "thing"

unset($value);
var_dump($value);
// Notice: Undefined variable: value

答案 2 :(得分:3)

没有理由这样做。脚本终止时将释放所有内存。

但是,如果你分配了大量的内存,那么这样做可能会很有用,特别是如果你的脚本需要更长的时间来运行。内存将立即释放,可供其他脚本使用。

但是就像你说的那样,代码需要这样做,使你的代码不那么清晰。因此,只有在分配了大量不再需要的数据时才会这样做,例如从磁盘读取的文件内容或带有查询结果的大数组。不要释放整数,也不要担心你的消息字符串。 :)

{评论后编辑}

我的回答主要集中在使用PHP进行网站脚本编写。当然,如果你要创建长时间运行的脚本,特别是如果它们分配的内存量变化很大,那么当然释放内存是有意义的,尽管这些脚本甚至可以运行一段有限的时间。

我不认为有很多用PHP编写的守护进程永远运行。大多数脚本,甚至是那些shell脚本,都执行特定任务(如果您可以调用'呈现网站'或'迁移数据库'),之后它们就会结束。在该任务的上下文中,释放您分配的每个变量仍然是无用的。这样的脚本和可能运行很长时间的程序,一遍又一遍地执行相同的任务或完全由用户控制,这是一个很大的不同,所以你不知道他们会做什么。如果您确实设法在PHP中编写长时间运行的脚本或守护程序,则适用其他规则,因为它是另一种应用程序。但到那个时候,你不会在寻找这个答案,因为你已经获得了足够的知识,知道你在做什么。

答案 3 :(得分:3)

对数组特别有用。我一直用它来删除我不再需要的数组元素。

$arr = array('test', 'No longer needed');

unset($arr[1]);

但我个人并不认为它在您的代码示例中有用。

答案 4 :(得分:2)

unset的一个用途是限制变量的范围。

<?php
$message = "Line 1\r\nLine 2\r\nLine 3";
mail('admin@example.com', 'My Subject', $message);

/* if you don't unset $message here, it will span across the include below */
unset($message);

include 'library.inc.php';
?>

从php手册:

  

变量的范围是定义它的上下文。对于   大多数PHP变量只有一个范围。这个单身   范围跨度包括和所需的文件。例如:

您可以在此处阅读有关变量范围的更多信息: http://php.net/manual/en/language.variables.scope.php

理想情况下,变量应该正确初始化,但是如果你不能完全确定不会对包含的文件引入副作用,那么只需取消设置变量。

答案 5 :(得分:1)

我不知道它是否适合这里,但我使用了unset()和$ _SESSION变量......

我相信我正在使用它来通过页面传递错误消息。当回显或处理错误时 - unset($_SESSION['error'])将清除错误消息并且脚本可以继续。