关于内存的划分和传引用传参数的区别
1.堆
2.栈 空间较小
3.全局
4.代码段
要搞懂每个区域放什么东西
堆 复杂类型
栈 变量
静
代
复杂类型对象没有指针指的时候,堆中的内容垃圾回收
1
函数传对象的时候,其实是首先在堆里面开一个内存放对象属性内容,在栈里面开一个内存放一个变量,变量里面放地址,指向堆的那个对象,传对象的时候,是在栈里面再开一个内存,里面的内容是刚才那个指向对象的栈变量的地址,也是指向堆的那个对象,函数返回的时候,这个赋值过来的指针断开。在函数里面的修改也会对原来对象产生变化。
2
而传引用对象进去的时候,用的还是原来那个栈的指向堆对象的地址变量,所以,出来的时候也会发生改变。
3
php可以传对象进函数中去,然后在函数里面把对象赋值成整形变量,这时候,过程是,在栈里面开一个内存放地址变量,这个地址常用也是传参时栈里面指向堆对象的那个地址变量赋值过来的,然后把新的那个指向堆对象的地址变量赋值成整数,就是原来的地址变成了整数,这时候它和堆对象的连接就断开了,等函数返回的时候,原对象没有任何变化
4
php传引用对象进去的时候,然后在函数里面把对象赋值成整数变量,这时候,过程是,原来指向堆对象的地址变量变成整数,指向堆对象的连接断开,然后原来的堆对象由于没有任何指针指向它就垃圾回收了,然后原来的那个对象引用变量就变成整数了。
new的时候就是在堆里面开一个内存,让栈里面的一个变量指向它,这个变量放地址
5
如果传函数参数是传对象进去,在函数里面用参数又new一个对象,过程是栈赋值一个地址变量,这个地址变量再自己new一个堆出来,函数返回时原来的对象不变
6
如果传函数参数是传引用对象进去,在函数里面用参数又new一个对象,过程是原来的那个栈地址变量自己又指向一个新的堆对象,原来那个对象被释放,返回时是新的函数里面改变的内容,但是不是原来那个对象了。
栈 变量
静
代
复杂类型对象没有指针指的时候,堆中的内容垃圾回收
1
函数传对象的时候,其实是首先在堆里面开一个内存放对象属性内容,在栈里面开一个内存放一个变量,变量里面放地址,指向堆的那个对象,传对象的时候,是在栈里面再开一个内存,里面的内容是刚才那个指向对象的栈变量的地址,也是指向堆的那个对象,函数返回的时候,这个赋值过来的指针断开。在函数里面的修改也会对原来对象产生变化。
2
而传引用对象进去的时候,用的还是原来那个栈的指向堆对象的地址变量,所以,出来的时候也会发生改变。
3
php可以传对象进函数中去,然后在函数里面把对象赋值成整形变量,这时候,过程是,在栈里面开一个内存放地址变量,这个地址常用也是传参时栈里面指向堆对象的那个地址变量赋值过来的,然后把新的那个指向堆对象的地址变量赋值成整数,就是原来的地址变成了整数,这时候它和堆对象的连接就断开了,等函数返回的时候,原对象没有任何变化
4
php传引用对象进去的时候,然后在函数里面把对象赋值成整数变量,这时候,过程是,原来指向堆对象的地址变量变成整数,指向堆对象的连接断开,然后原来的堆对象由于没有任何指针指向它就垃圾回收了,然后原来的那个对象引用变量就变成整数了。
new的时候就是在堆里面开一个内存,让栈里面的一个变量指向它,这个变量放地址
5
如果传函数参数是传对象进去,在函数里面用参数又new一个对象,过程是栈赋值一个地址变量,这个地址变量再自己new一个堆出来,函数返回时原来的对象不变
6
如果传函数参数是传引用对象进去,在函数里面用参数又new一个对象,过程是原来的那个栈地址变量自己又指向一个新的堆对象,原来那个对象被释放,返回时是新的函数里面改变的内容,但是不是原来那个对象了。