> 백엔드 개발 > PHP 튜토리얼 > php变量与对象的疑问

php变量与对象的疑问

WBOY
풀어 주다: 2016-06-06 20:47:30
원래의
1045명이 탐색했습니다.

<code>class a {}

for ($i=0; $i ";
}
</code>
로그인 후 복사
로그인 후 복사

输出结果:
object(a)#1 (0) { }
object(a)#2 (0) { }
object(a)#1 (0) { }

我想问为什么是 #1,#2,#1 呢?

回复内容:

<code>class a {}

for ($i=0; $i ";
}
</code>
로그인 후 복사
로그인 후 복사

输出结果:
object(a)#1 (0) { }
object(a)#2 (0) { }
object(a)#1 (0) { }

我想问为什么是 #1,#2,#1 呢?

第一次运行 new a,新建了一个对象。
第二次运行new a,又新建了一个对象。
然后重新赋值给$a之后,第一个对象没用了,就回收了。
然后回收留出来的坑,就留给第三次运行new a产生的对象。

你可以实验下,加了 unset后就一致了

<code>class a {}

for ($i=0; $i ";
    unset($a);
}
</code>
로그인 후 복사

深入的话,可以找GC(Garbage collection)方面的资料。

  • #1中数字的含义是实例ID(instance id),即类被实例化之后对应的编号,又称为对象编号。
  • PHP自动垃圾回收,使用“引用计数”的方式去确定是否销毁变量,官网有非常详细的解释。
  • 你的问题不在于对象使用,而在于如何对$a进行计数,第一次循环,变量$a计数为1,指向#1对象,第二次循环由于已经脱离了第一次循环$a的作用域(精英王子 · 3小时前:『第二次循环由于已经脱离了第一次循环$a的作用域』的说法不正确,PHP 里面循环是不会创建新的作用域的,销毁第一次的 $a 是因为它被重新赋值。),所以经历了创建对象#2、销毁第一次创建的$a、创建第二次$a、赋值对象#2给$a、清空对象#1几个步骤,很遗憾我水平难以讲明白他们之间细微的前后关系。但值得肯定的是对象#2创建时,第一次循环的#1还尚未销毁,否则他就会以#1为编号了。
  • 因为主要是变量作用域、计数的问题,所以跟unset差不多的帮助理解的方式:

    //给变量命不同的名,不让它们在循环结束之前涉及到计数和销毁的问题
    for ($i=0; $i $name = 'n' . $i;
    ${$name} = new stdClass();
    var_dump(${name});
    }

  • 非常尊敬你研究的精神,但个人觉得这种知识的使用场景在PHP中并不太多,了解就好,没必要深究,装上xdebug插件,用xdebug_debug_zval('a')可以详细的看到变量的计数,或者用IDE在循环里下断点,一圈圈看变量值。

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿