我从来没有见过有人使用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);
?>
答案 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'])
将清除错误消息并且脚本可以继续。