5

我从未见过有人使用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);
?>
4

6 回答 6

7

这取决于。

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

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

无论哪种情况,如果您依赖arrays 并且需要删除一个值,这将很有用。一个愚蠢的例子,也许......但考虑这样的事情:

$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);
?>
于 2013-08-08T20:33:46.010 回答
5

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

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

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

unset($value);
var_dump($value);
// Notice: Undefined variable: value
于 2013-08-08T20:47:42.900 回答
4

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

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

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

{评论后编辑}

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

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

于 2013-08-08T20:27:13.690 回答
4

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

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

unset($arr[1]);

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

于 2013-08-08T20:32:15.377 回答
3

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

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

于 2013-08-08T20:37:40.190 回答
1

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

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

于 2013-08-08T23:14:01.420 回答