PHP的实例编号系统如何工作

top*_*erg 5 php instance instances

我已经使用PHP很多年了,但有一部分我从未真正了解过,并且最近一直在想.

当我执行以下操作时:

var_dump(new test());
var_dump(new test());
var_dump(new test());
var_dump(new test());
Run Code Online (Sandbox Code Playgroud)

我明白了:

object(test)[1]
object(test)[1]
object(test)[1]
object(test)[1]
Run Code Online (Sandbox Code Playgroud)

所有这些对象都具有相同的编号.我得知系统没有将实例分配给变量,因此它几乎立即被破坏.但是当我做以下事情时:

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());
Run Code Online (Sandbox Code Playgroud)

我明白了:

object(test)[1]
object(test)[2]
object(test)[1]
object(test)[2]
object(test)[1]
object(test)[2]
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,第一个是1,然后第二个是2,但是它循环而不是坚持2.

我猜测应用第一个实例的变量会被第二个调用中的新实例覆盖(从而破坏它),但是为什么第三个调用会在分配之前破坏第二个实例(将实例增量返回到1) ?

Lar*_*ert 7

实际上,首先创建新实例然后分配给它$a,销毁前一个实例.因此,在第一行中使用数字1,在第二行中,数字1仍然是"活着的",因此使用数字2.然后数字1被销毁.然后,在第3行中,数字1再次空闲,因此使用数字1.


Kor*_*tor 6

第二次调用后,实例#1已经被销毁,因此1再次被释放. 当时$a持有实例#2.将使用您的第三个呼叫创建的下一个实例#1再次分配.

第三次通话后,第二个实例被破坏.现在#1使用并#2再次变得自由.第四次通话将#2再次使用.

等等等等…