简单谈一谈PHP5和PHP7中zval的改动

这篇文章我尽量用通俗的话来稍微形容一下两者zval的不同。总结在最后。

正式开始

zval的结构:

  1. 类型
  2. refcount:指此参数被用了几次(包括引用),垃圾回收机制也是判断这个值,int
  3. is_ref:是否被引用,true|false

<?php
	$a = 1;
	xdebug_debug_zval('a');
?>PHP5下会打印:
	a: (refcount=1, is_ref=0)=1

	PHP7:
	a: (refcount=0, is_ref=0)int 1

这个例子我们可以看出来PHP7对于int类型1,不做计数。我们可以查阅到这是zval的其中一个改动。
PHP5标量数据类型会计数,PHP7标量数据类型(布尔,整形,字符串,浮点型)不再计数,不需要单独分配内存。


<?php
	$a = "new string";
	xdebug_debug_zval('a');
?>

	PHP5:
		a: (refcount=1, is_ref=0)='new string'

	PHP7:
		a: (refcount=1, is_ref=0)string 'new string' (length=10)
<?php
	$a = "new string";
	$b = $a;
	xdebug_debug_zval( 'a' );
?>

	PHP5:
		a: (refcount=2, is_ref=0)='new string'

	PHP7:
		a: (refcount=1, is_ref=0)string 'new string' (length=10)

这边会发现PHP7下重复赋值之后,计数count没有+1。
因为字符串也是属于标量,不再多次记录。


<?php
	$a = "new string";
	$c = $b = $a;
	xdebug_debug_zval( 'a' );
	unset( $a, $b );
	xdebug_debug_zval( 'c' );
?>

	PHP5:
		a: (refcount=3, is_ref=0)='new string'
		c: (refcount=1, is_ref=0)='new string'

	PHP7:
		a: (refcount=1, is_ref=0)string 'new string' (length=10)
		c: (refcount=1, is_ref=0)string 'new string' (length=10)

这里unset($a)之后,就会把变量c复制分离出来。


<?php
	$a = array( &
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值