Php 如何摧毁一个物体?

Php 如何摧毁一个物体?,php,object,destructor,destroy,Php,Object,Destructor,Destroy,据我所知(这是非常少的),有两种方法: $var = new object() 然后: 还有更好的方法吗?我在这里发毛吗?你在找我 但是要考虑到,您不能显式销毁对象。 但是,如果您取消设置对象,并且脚本将PHP推到内存限制,则不需要的对象将被垃圾收集。我将使用unset()(而不是将其设置为null),因为它似乎有更好的性能(未经测试,但在PHP官方手册中有记录) 也就是说,一定要记住,PHP总是在页面提供后立即销毁对象。因此,这应该只在非常长的循环和/或高强度的页面上才需要。我会选择unse

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

$var = new object()
然后:

还有更好的方法吗?我在这里发毛吗?

你在找我

但是要考虑到,您不能显式销毁对象。

但是,如果您取消设置对象,并且脚本将PHP推到内存限制,则不需要的对象将被垃圾收集。我将使用
unset()
(而不是将其设置为null),因为它似乎有更好的性能(未经测试,但在PHP官方手册中有记录)


也就是说,一定要记住,PHP总是在页面提供后立即销毁对象。因此,这应该只在非常长的循环和/或高强度的页面上才需要。

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

一篇便利的帖子解释了关于这一点的几个错误理解:

这涵盖了关于析构函数如何工作的一些误解。根据PHP5文档,显式调用它实际上不会破坏变量:

PHP5引入了一个类似于其他函数的析构函数概念 面向对象的语言,如C++。析构函数方法将是 在没有其他对某个特定对象的引用时立即调用 对象,或在关闭序列期间按任何顺序


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

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

我觉得给出了正确的答案,但答案很简单。是的,通常unset()最适合“速度”,但是如果您想立即回收内存(以CPU为代价),应该使用null

与前面提到的其他对象一样,设置为null并不意味着所有内容都被回收,您可以拥有共享内存(未封闭)对象,以防止对象被破坏。此外,正如其他人所说,无论如何都不能显式地“销毁”对象,因此无论如何都不应该尝试这样做

你需要找出最适合你的。此外,您还可以对对象使用_destruct(),该对象将在unset或null上调用,但应谨慎使用,正如其他人所说,永远不要直接调用

见:


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

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

二,


请参见此处的操作:

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

$MyConnection=newmysqli($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

之前关闭对象,除非您确实有来源来备份您的答案,否则您可能不应该发布您认为“可能”发生的事情。这是不有用的,导致这种错误信息被当作真理并重复。@ MaGar,这就是我链接到官方手册页的确切原因,在评论中,有一个比较UNSET()的样本测试为NULL。所以弗兰基,我来自C++,在这里我们使用<代码>新< /代码>,然后我们必须使用
delete
一次。这在PHP中不是真的吗?当对象不再需要时,会自动进行垃圾收集?@gsamaras确实如此。不过,您也可能存在漏洞,如果您正在执行守护进程或类似操作,则应该阅读更多关于php的GC的内容。在大多数网站上,请求的时间都很短,根本不重要。
unset()?它是单元测试所需要的,这个概念在2012年并没有广泛传播,我想是的,您已经销毁了
$var2
,它是对
$var
的引用。现在您也销毁了
$var
,并且假定对象上没有其他引用,那么就完成了。您不是在销毁对象,而是在销毁指向该对象的指针。这是一个很大的区别。在其他语言中,你可以销毁一个对象,而所有其他指针都会给你异常或垃圾,但phpy的情况并非如此,你不能销毁。如果没有保存该对象的引用,则该对象已准备好由垃圾收集器收集。您不能强制运行垃圾收集器。
Error:
mysqli Object

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