unset传递的值是一个对象或者值的复制(比如传递数组,传递的是一个新的复制,而不是引用),结果原对象却被销毁了。好奇怪。
大神快来解答这个问题。以前一直用unset,今天突然想到了这个问题。
比如:
这时就会报出Undefined variable的错误。
正如舞林所说,这种销毁变量的方式有可能是将引用计数减一。
但是这样做:
这个时候,$a依然被销毁。报出Undefined variable的错误的错误。
如果unset掉b,来看看结果:
只是销毁了$b,$b虽然是$a的引用,但是$a没有被销毁。打印出hello
所以unset的机制并没有那么简单。。
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
我觉得你说得好像不成立。。
对象赋值本身就是引用赋值,但是unset 引用的变量 只是把引用给销毁了,并不会销毁原变量
我的理解是这个样子
...你 确定?
------------update-------------
把评论里的拿上来
unset只是断开了变量 名和值 之间的绑定
引用:
"该函数只有在变量值所占空间超过256字节长的时候才会释放内存"
&&
"有当指向该值的所有变量(比如有引用变量指向该值)都被销毁后,地址才会被释放"
unset($a)无论你$a是怎么得到的(直接赋值$a=true、传值$a=$b、传址$a=&$b),以及对$a进行过什么操作(传值给别的变量$b=$a或传址$b=&$a),它都会断掉$a的引用,并把$a抹成null。至于被赋值的那个对象是不受影响的,引用计数自己会处理好。
同意楼上几位的回答,如果LZ的问题依然存在,不妨贴出你的代码可以更好的说明情况。
不过我想通过以下代码给LZ提个醒:
另外反过来一样
可以看出:
即时向unset传递一个变量的引用,也不会把该变量销毁所以我不太能理解LZ的问题是怎么一回事……
这段代码是我从别处搜索来的,我认为应该能够解决你的疑问!
如果在函数中 unset() 一个通过引用传递的变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。
上边的例子将输出:
something
something