PHP输出的奇怪问题阿!!!求大神帮忙看看我看了一天没看懂哪里来的奇怪字符首先我刚开始学php 写了个从数据库读完后 输出JSON的过程看上去结果是对的阿~~~ 然后我去某效验网站 提示我
unset传递的值是一个对象或者值的复制(比如传递数组,传递的是一个新的复制,而不是引用),结果原对象却被销毁了。好奇怪。
大神快来解答这个问题。以前一直用unset,今天突然想到了这个问题。
比如:
这时就会报出Undefined variable的错误。
正如舞林所说,这种销毁变量的方式有可能是将引用计数减一。
但是这样做:
这个时候,$a依然被销毁。报出Undefined variable的错误的错误。
如果unset掉b,来看看结果:
只是销毁了$b,$b虽然是$a的引用,但是$a没有被销毁。打印出hello
所以unset的机制并没有那么简单。。
回复内容:
unset传递的值是一个对象或者值的复制(比如传递数组,传递的是一个新的复制,而不是引用),结果原对象却被销毁了。好奇怪。
大神快来解答这个问题。以前一直用unset,今天突然想到了这个问题。
比如:
这时就会报出Undefined variable的错误。
正如舞林所说,这种销毁变量的方式有可能是将引用计数减一。
但是这样做:
这个时候,$a依然被销毁。报出Undefined variable的错误的错误。
如果unset掉b,来看看结果:
只是销毁了$b,$b虽然是$a的引用,但是$a没有被销毁。打印出hello
所以unset的机制并没有那么简单。。
第一段代码 a和b是两块不同的内存 所以unset掉两者 根本没影响
第二段代码 b引用a 使得对应的zval ref_count+1 is_ref +1 此时不管unset掉a或者b 只是断了一根引用对另外的那个值没影响 还是指向的那块区域
变量引用次数-1,只要有对该内存块的引用,该内存块就不会被销毁
update:
昨天写答案提交发现服务器在调皮的维护,以为没发出去呢...
TIPI有写具体的内容:
http://www.php-internals.com/book/?p=chapt03/03-01-00-variables-structure
//变量结构体
http://www.php-internals.com/book/?p=chapt03/03-06-01-var-define-and-init
//变量的赋值和销毁,这里详细讲解了引用计数
我觉得你说得好像不成立。。
$o = new stdClass();
$o->var = 123;
$new_o = $o; //等于$new_o = & $o;
unset($new_o);
var_dump($o);
对象赋值本身就是引用赋值,但是unset 引用的变量 只是把引用给销毁了,并不会销毁原变量
我的理解是这个样子
...你 确定?
------------update-------------
把评论里的拿上来
unset只是断开了变量 名和值 之间的绑定
引用:
"该函数只有在变量值所占空间超过256字节长的时候才会释放内存"
&&
"有当指向该值的所有变量(比如有引用变量指向该值)都被销毁后,地址才会被释放"
unset($a)无论你$a是怎么得到的(直接赋值$a=true、传值$a=$b、传址$a=&$b),以及对$a进行过什么操作(传值给别的变量$b=$a或传址$b=&$a),它都会断掉$a的引用,并把$a抹成null。
至于被赋值的那个对象是不受影响的,引用计数自己会处理好。
同意楼上几位的回答,如果LZ的问题依然存在,不妨贴出你的代码可以更好的说明情况。
不过我想通过以下代码给LZ提个醒:
$foo = true;
$bar = &$foo;
unset($foo);
var_dump($bar); // 结果是true,而不是null
另外反过来一样
$foo = true;
$bar = &$foo;
unset($bar);
var_dump($foo); // 结果依然是true,而不是null
可以看出:即时向unset传递一个变量的引用,也不会把该变量销毁
所以我不太能理解LZ的问题是怎么一回事……
这段代码是我从别处搜索来的,我认为应该能够解决你的疑问!
如果在函数中 unset() 一个通过引用传递的变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。
上边的例子将输出:
something
something
楼主第二个测试,可以输出$b 试试,一样没有被销毁
参考这个
http://php.net/manual/zh/features.gc.refcounting-basics.php
PHP输出的奇怪问题阿!!!求大神帮忙看看我看了一天没看懂哪里来的奇怪字符首先我刚开始学php 写了个从数据库读完后 输出JSON的过程看上去结果是对的阿~~~ 然后我去某效验网站 提示我
php有timer功能吗??很奇怪?php有timer功能吗??很奇怪?
PHP
timer
php有timer功能吗??很奇怪?php有timer功能吗??很奇怪? PHP timer
首先我刚开始学php 写了个从数据库读完后 输出JSON的过程 看上去结果是对的阿~~~ 然后我去某效验网站 提示我 于是我找了半天原因发现不知道哪里来的阿 在字符串前面有4个莫名其妙的东西。。...
每一种编程语言都有它独自的“怪癖”,比如奇怪的语法、与众不同的功能或是不符标准的实现方法。程序员也都有着自己的习惯,这就会使得很多程序员,甚至是一些经验丰富的开发者,在面对一门新的语言时都会感到抓狂。...
一个很奇怪的PHP问题我要把$one_news里面的content字段的双引号替换为单引号,然后赋给$news[content],但是发生了很奇怪的问题,如下:
//这样可以
$one_news['content']=str_replace('"','\'',$one_news['cont
一个很奇怪的PHP问题我要把$one_news里面的content字段的双引号替换为单引号,然后赋给$news[content],但是发生了很奇怪的问题,如下://这样可以$one_news['content']=str_replace('"','\'',$one_news['content
我今天在用php的include引入文件出现奇怪的问题:
这是我的header_mp.php文件:
下面是我引入的部分:
这应该没问题吧,可是浏览预览就出问题了,布局全乱了,我用chrome控制台一看源文件:
奇怪的抓取结果我想抓取http://www.sctport.com.cn/newsctsite/sct/cntrnoplan.jsp?ToPage=1这个页面的表格内容,但奇怪了,为什么只能抓取中文的部分,不能抓取英文的部分?太奇怪了。 用SNOOPY类,代码如下: 高手帮忙看看啊,我郁闷死...
奇怪的抓取结果我想抓取http://www.sctport.com.cn/newsctsite/sct/cntrnoplan.jsp?ToPage=1这个页面的表格内容,但奇怪了,为什么只能抓取中文的部分,不能抓取英文的部分?太奇怪了。 用SNOOPY类,代码如下: 高手帮忙看看啊,我郁闷死...