php创建一个整型变量时zval的refcount为什么是0

弧剑飘香 2016-10-20 10:13:16
有两个问题:
第一个:
$str = "test zval";
xdebug_debug_zval('str');

如上,当php创建一个字符串时,通过xdebug_debug_zval查看的结果是:
str: (refcount=1, is_ref=0)='test zval'
于是,我理所当然的觉得,当php创建一个整型变量时,通过xdebug_debug_zval查看的结果也应该是: (refcount=1, is_ref=0)
但实际情况是:
$a = 123;
xdebug_debug_zval('a');

输出为:
a: (refcount=0, is_ref=0)=123
我们知道refcount是一个计数器,用来保存有多少个变量指向该zval,但为什么当创建整型变量时,refcount为0呢?
我的php版本为7.0,难道是php版本的问题吗?
第二个:
$ar = array(
'id' => 38,
'name' => 'shine'
);
xdebug_debug_zval('ar');

输出为:
ar: (refcount=1, is_ref=0)=array ('id' => (refcount=0, is_ref=0)=38, 'name' => (refcount=2, is_ref=0)='shine')
奇怪为什么会有两个变量指向$ar['name']呢?
请大神解答一下,谢谢!
...全文
277 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
汉诺塔少年 2019-11-29
  • 打赏
  • 举报
回复
我也是这个疑问!谢谢楼主分享!
Just_cl 2016-10-20
  • 打赏
  • 举报
回复
http://blog.csdn.net/black_ox/article/details/50341225看看这个,从PHP7开始, 对于在zval的value字段中能保存下的值, 就不再对他们进行引用计数了, 而是在拷贝的时候直接赋值, 这样就省掉了大量的引用计数相关的操作, 这部分类型有: IS_LONG IS_DOUBLE 当然对于那种根本没有值, 只有类型的类型, 也不需要引用计数了: IS_NULL IS_FALSE IS_TRUE,123属于is_long,不进行引用计数所以为0,不知道对不
弧剑飘香 2016-10-20
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
#4 的第一段信息,是 php 5 的 第二段信息,是 php 7 的 #1 已经告诉了你 php7 内核发生了变化,算法不同,结果自然也不同 纠结这个有什么用
探讨的就是算法是怎么变的,想知其所以然,想了解这个过程,难道不行么
Just_cl 2016-10-20
  • 打赏
  • 举报
回复
版主大大都发话了,纠结啥,快送分关贴
xuzuning 2016-10-20
  • 打赏
  • 举报
回复
#4 的第一段信息,是 php 5 的 第二段信息,是 php 7 的 #1 已经告诉了你 php7 内核发生了变化,算法不同,结果自然也不同 纠结这个有什么用
弧剑飘香 2016-10-20
  • 打赏
  • 举报
回复
引用 3 楼 Just_cl 的回复:
兄弟,你这代码是不是从这里抠的啊http://www.aiuxian.com/article/p-1917447.html,你要的第二个问题的答案在里面了~
是看了这篇文章,然后发现和博主的运行结果不一样所以才困惑啊,博主的输出是: ar: (refcount=1, is_ref=0)=array ( 'id' => (refcount=1, is_ref=0)=38, 'name' => (refcount=1, is_ref=0)='shine' ) 而我的输出是: ar: (refcount=1, is_ref=0)=array ( 'id' => (refcount=0, is_ref=0)=38, 'name' => (refcount=2, is_ref=0)='shine' ) 38对应的refcount为0的原因现在知道了,但不知'shine'对应的refcount为何是2
Just_cl 2016-10-20
  • 打赏
  • 举报
回复
兄弟,你这代码是不是从这里抠的啊http://www.aiuxian.com/article/p-1917447.html,你要的第二个问题的答案在里面了~
弧剑飘香 2016-10-20
  • 打赏
  • 举报
回复
引用 1 楼 Just_cl 的回复:
http://blog.csdn.net/black_ox/article/details/50341225看看这个,从PHP7开始, 对于在zval的value字段中能保存下的值, 就不再对他们进行引用计数了, 而是在拷贝的时候直接赋值, 这样就省掉了大量的引用计数相关的操作, 这部分类型有: IS_LONG IS_DOUBLE 当然对于那种根本没有值, 只有类型的类型, 也不需要引用计数了: IS_NULL IS_FALSE IS_TRUE,123属于is_long,不进行引用计数所以为0,不知道对不
我觉得是这么回事,多谢!第二个问题还期待解答

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧