PHP 函数中实例化对象 并把这个对象返回,是否会产生垃圾系统将不自动收?

WBOY
リリース: 2016-06-06 20:18:39
オリジナル
1819 人が閲覧しました

如题,如果我这么创建代码
假如有一个Apple这个类。

<code>function abc()
{
    $a = new Apple();
    return a;
}

$a = abc();
$name = $a -> getname();
......
</code>
ログイン後にコピー
ログイン後にコピー

经过上述这么调用后,是不是$a就不会自动被PHP垃圾处理器回收?

回复内容:

如题,如果我这么创建代码
假如有一个Apple这个类。

<code>function abc()
{
    $a = new Apple();
    return a;
}

$a = abc();
$name = $a -> getname();
......
</code>
ログイン後にコピー
ログイン後にコピー

经过上述这么调用后,是不是$a就不会自动被PHP垃圾处理器回收?

struct _zval_struct {

<code>zvalue_value value; 
unsigned char type; 
unsigned char is_ref;
short refcount;</code>
ログイン後にコピー

};

value:变量的值
type:变量的类型
is_ref:变量是否被引用
refcount:引用次数

重点在is_ref,如果为false,说明当前没有被按引用引用,且refcount为0时,则PHP垃圾回收机制会将其回收。

备注:函数中的$a在函数执行完毕后,立刻被回收。函数外的$a,必须被手动销毁,要么就是脚本执行完毕后,变量$a被销毁!

函数中的$a的话,函数执行完就被释放了。

函数外的$a如果你不unset的话,在脚本执行完之前都会存在。

函数中创建的Apple对象的话,因为你把它作为返回值,函数外的$a还保存着对Apple对象的引用,所以不会被回收。除非你把函数外的$a给unset了或者修改了它的值,使得没有对Apple对象的引用了,Apple对象才会被回收。

变量引用次数为零自然会被回收

确定后面不再使用全局变量$a,那执行unset($a)释放掉就好了.

PHP的垃圾回收是基于引用计数实现的,具体看官方文档:
http://php.net/manual/zh/features.gc.php

関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート