我已经使用PHP很多年了,但有一部分我从未真正了解过,并且最近一直在想。
当我执行以下操作时:
var_dump(new test());
var_dump(new test());
var_dump(new test());
var_dump(new test());
我明白了:
object(test)[1]
object(test)[1]
object(test)[1]
object(test)[1]
所有这些对象都具有相同的编号。我得知系统没有将实例分配给变量,因此它几乎立即被破坏。但是当我做以下事情时:
var_dump($a = new test());
var_dump($a = new test());
var_dump($a = new test());
var_dump($a = new test());
var_dump($a = new test());
var_dump($a = new test());
我明白了:
object(test)[1]
object(test)[2]
object(test)[1]
object(test)[2]
object(test)[1]
object(test)[2]
正如你所看到的,第一个是1,然后第二个是2,但是它循环而不是坚持2。
我猜测应用第一个实例的变量会被第二次调用中的新实例覆盖(从而破坏它),但为什么第三个调用会在分配之前破坏第二个实例(返回实例增量器)到1)?
答案 0 :(得分:7)
实际上,首先创建新实例,然后将其分配给$a
,从而销毁先前的实例。因此,在第一行中使用数字1,在第二行中,数字1仍然是“活着的”,因此使用数字2。然后数字1被销毁。然后,在第3行中,数字1再次空闲,因此使用数字1。
答案 1 :(得分:6)
第二次调用后,实例#1
已被销毁,因此1再次空闲。
$a
当时持有实例#2
。
使用第三个电话创建的下一个实例将再次分配#1
。
第三次通话后第二个实例被破坏。现在使用#1
,#2
再次免费。第四个电话会再次使用#2
。
依此类推......