如何破坏物体?

时间:2012-01-10 04:09:03

标签: php object destructor destroy

据我所知(这很少),有两种方式,给出:

$var = new object()

然后:

// Method 1: Set to null
$var = null;
// Method 2: Unset 
unset($var); 

其他更好的方法?我在这里分裂头发吗?

6 个答案:

答案 0 :(得分:133)

您正在寻找unset()

但请注意您无法明确销毁某个对象。

它将保留在那里,但是如果您取消设置对象并且您的脚本将PHP推送到内存限制,则不需要的对象将被垃圾收集。我会选择unset()(而不是将其设置为null),因为它似乎具有更好的性能(未经过测试,但在PHP官方手册中记录在one of the comments上)。

那就是说,请记住PHP一旦提供页面就会一直销毁对象。所以这应该只需要很长的循环和/或密集的页面。

答案 1 :(得分:8)

一个方便的帖子解释了对此的几个误解:

Don't Call The Destructor explicitly

这涵盖了几个关于析构函数如何工作的误解。根据PHP5文档:

,显式调用它实际上不会破坏你的变量
  

PHP 5引入了类似于其他概念的析构函数概念   面向对象的语言,例如C ++。析构函数方法将是   只要没有其他特定参考,就会调用   对象,或在关机序列期间的任何顺序。

上面的帖子确实说明将变量设置为null在某些情况下可以正常工作,只要没有其他东西指向已分配的内存。

答案 2 :(得分:1)

简短回答:两者都是必需的。

我觉得正确的答案是最低限度的。是的,通常unset()最适合"速度",但如果你想立即回收内存(以CPU为代价)应该使用null。

与其他提到的一样,设置为null并不意味着回收所有内容,您可以拥有共享内存(未克隆)对象,以防止破坏对象。而且,和其他人一样,你不能摧毁"无论如何,这些对象都是明确的,所以你无论如何都不应该尝试这样做。

您需要找出最适合您的方法。你也可以使用__destruct()作为一个将在unset或null上调用的对象,但它应该小心使用,就像其他人说的那样,永远不要直接调用!

请参阅:

http://www.stoimen.com/blog/2011/11/14/php-dont-call-the-destructor-explicitly/

What is difference between assigning NULL and unset?

答案 3 :(得分:0)

这是一个简单的证明,您不能破坏对象,只能破坏与对象的链接。

$var = (object)['a'=>1];
$var2 = $var;
$var2->a = 2;
unset($var2);
echo $var->a;

返回

  

2

在此处查看实际操作:https://eval.in/1054130

答案 4 :(得分:0)

可能是在创建新的mysqli对象的情况下。

$MyConnection = new mysqli($hn, $un, $pw, $db);

但即使在关闭对象之后

$MyConnection->close();

如果您将使用print_r()检查$MyConnection的内容,则会出现以下错误:

Error:
mysqli Object

Warning: print_r(): Property access is not allowed yet in /path/to/program on line ..
( [affected_rows] => [client_info] => [client_version] =>.................)

在这种情况下,您不能使用unlink(),因为unlink()将需要路径名字符串,但是在这种情况下,$MyConnection是一个对象。

因此,您还有另一种选择将其值设置为null:

$MyConnection = null;

现在,一切顺利,如您所愿。在变量$MyConnection中没有任何内容,而且您已经清理了mysqli对象。

建议您先关闭对象,然后再将变量的值设置为null

答案 5 :(得分:-8)

我会使用unset,因为它可能会给垃圾收集器一个更好的提示,以便可以更快地再次使用内存。请注意,对象指向的任何内容要么具有其他引用,要么首先取消设置,否则您将不得不等待垃圾收集器,因为它们将没有句柄。