84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
class a {} for ($i=0; $i < 3; $i++) { $a = new a; var_dump($a); echo "<br/>"; }
输出结果: object(a)#1 (0) { } object(a)#2 (0) { } object(a)#1 (0) { }
我想问为什么是 #1,#2,#1 呢?
光阴似箭催人老,日月如移越少年。
第一次运行 new a,新建了一个对象。 第二次运行new a,又新建了一个对象。 然后重新赋值给$a之后,第一个对象没用了,就回收了。 然后回收留出来的坑,就留给第三次运行new a产生的对象。
new a
$a
你可以实验下,加了 unset后就一致了
unset
class a {} for ($i=0; $i < 3; $i++) { $a = new a; var_dump($a); echo "<br/>"; unset($a); }
深入的话,可以找GC(Garbage collection)方面的资料。
#1
因为主要是变量作用域、计数的问题,所以跟unset差不多的帮助理解的方式:
//给变量命不同的名,不让它们在循环结束之前涉及到计数和销毁的问题 for ($i=0; $i < 3; $i++) { $name = 'n' . $i; ${$name} = new stdClass(); var_dump(${name}); }
非常尊敬你研究的精神,但个人觉得这种知识的使用场景在PHP中并不太多,了解就好,没必要深究,装上xdebug插件,用xdebug_debug_zval('a')可以详细的看到变量的计数,或者用IDE在循环里下断点,一圈圈看变量值。
xdebug
xdebug_debug_zval('a')
第一次运行
new a
,新建了一个对象。第二次运行
new a
,又新建了一个对象。然后重新赋值给
$a
之后,第一个对象没用了,就回收了。然后回收留出来的坑,就留给第三次运行
new a
产生的对象。你可以实验下,加了
unset
后就一致了深入的话,可以找GC(Garbage collection)方面的资料。
#1
中数字的含义是实例ID(instance id),即类被实例化之后对应的编号,又称为对象编号。$a
进行计数,第一次循环,变量$a计数为1,指向#1对象,第二次循环由于已经脱离了第一次循环$a的作用域(精英王子 · 3小时前:『第二次循环由于已经脱离了第一次循环$a的作用域』的说法不正确,PHP 里面循环是不会创建新的作用域的,销毁第一次的 $a 是因为它被重新赋值。),所以经历了创建对象#2、销毁第一次创建的$a、创建第二次$a、赋值对象#2给$a、清空对象#1几个步骤,很遗憾我水平难以讲明白他们之间细微的前后关系。但值得肯定的是对象#2创建时,第一次循环的#1还尚未销毁,否则他就会以#1为编号了。因为主要是变量作用域、计数的问题,所以跟
unset
差不多的帮助理解的方式://给变量命不同的名,不让它们在循环结束之前涉及到计数和销毁的问题
for ($i=0; $i < 3; $i++) {
$name = 'n' . $i;
${$name} = new stdClass();
var_dump(${name});
}
非常尊敬你研究的精神,但个人觉得这种知识的使用场景在PHP中并不太多,了解就好,没必要深究,装上
xdebug
插件,用xdebug_debug_zval('a')
可以详细的看到变量的计数,或者用IDE在循环里下断点,一圈圈看变量值。