如何摧毁一个物体?

据我所知(这是非常少的) ,有两种方式,给出:

$var = new object()

然后:

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

还有更好的办法吗,我是在吹毛求疵吗?

203524 次浏览

你在找 unset()

但是考虑到 你不能明确地摧毁一个物体。

但是,如果您取消对象设置并且脚本将 PHP 推到内存限制,那么不需要的对象将被垃圾收集。我会选择 unset()(而不是将其设置为 null) ,因为它似乎有更好的性能(没有经过测试,但是从 PHP 官方手册中在 其中一条评论上进行了记录)。

也就是说,请记住 PHP 总是在页面被提供时立即销毁对象。因此,只有在非常长的循环和/或非常繁重的页面上才需要这样做。

我会选择 unset,因为它可能会给垃圾收集器一个更好的提示,这样内存就可以更快地重新可用。请注意,对象指向的任何事物要么有其他引用,要么首先取消设置,否则您将不得不等待垃圾收集器,因为那样就不会有对它们的句柄。

一个简单的帖子解释了关于这个问题的几个误解:

不要明确调用析构函数

这里涵盖了关于析构函数如何工作的几个误解。根据 PHP5文档,明确地调用它实际上并不会破坏变量:

PHP5引入了一个与其他 面向对象的语言,例如 C + + 只要没有其他引用到特定的 对象,或者在关闭序列期间以任何顺序。

上面的文章确实指出,在某些情况下,只要没有其他任何东西指向已分配的内存,将变量设置为 null 就可以工作。

简短的回答: 两者都需要。

我觉得答案是正确的,但最低限度。是的,通常 unset ()对于“速度”来说是最好的,但是如果您想立即回收内存(以 CPU 的成本为代价) ,那么应该使用 null。

正如前面提到的,设置为 null 并不意味着所有内容都被回收,您可以使用共享内存(未克隆)对象来防止对象的破坏。此外,正如其他人所说,你无论如何也不能明确地“销毁”对象,所以你不应该试图这样做。

你需要弄清楚哪个对你来说是最好的。还可以使用 _ _ destruct ()作为对象,它将在 unset 或 null 时被调用,但是应该谨慎使用,就像其他人说的那样,永远不要直接调用!

参见:

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

赋值 NULL 和取消设置有什么区别?

在 PHP 中,不是销毁对象,而是销毁指向对象的指针。这是一个很大的区别。

在其他语言中,您可以销毁一个对象,而所有其他指针都会给您提供异常或垃圾,但 PHP 不是这种情况。

这是一个简单的证明,你不能摧毁一个对象,你只能摧毁它的链接。

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

报税表

2

在这里可以看到它的实际运作: https://eval.in/1054130

可能是在创建一个新 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是一个 Object。

因此,您可以选择将其值设置为 null:

$MyConnection = null;

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

建议在将变量值设置为 null之前关闭 Object。