如何破坏物体?

Pan*_*ate 110 php destructor object destroy

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

$var = new object()
Run Code Online (Sandbox Code Playgroud)

然后:

// Method 1: Set to null
$var = null;
// Method 2: Unset 
unset($var); 
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*kie 143

你在找unset().

但请注意,您无法显式销毁对象.

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

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

  • @gsamaras这是真的.但是,你也可能有泄漏,如果你正在做守护进程或者类似的话,你应该在php的GC上阅读更多内容.在大多数网站中,请求是如此短暂,以至于无关紧要.http://php.net/manual/en/features.gc.refcounting-basics.php (3认同)

stu*_*kad 8

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

不要显式调用析构函数

这包含了几个关于析构函数如何工作的误解.根据PHP5文档,显式调用它实际上不会破坏你的变量:

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

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


Mik*_*e Q 5

简短回答:两者都需要。

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

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

您需要弄清楚哪一个最适合您。您还可以将 __destruct() 用于将在未设置或为 null 时调用的对象,但应谨慎使用,并且像其他人所说的那样,永远不要直接调用!

看:

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

分配 NULL 和未设置有什么区别?