3.在字符串类型中,默认保留了字符串的长度。这样很容易做到字符串的二进制安全,
并且在计算字符串长度的时候不需要进行扫描。
观察
PHP 弱变量的实现,也会有以下疑惑:
1.为什么会没有 int 类型呢?其实在 PHP 中是有的,只是说默认 int 数据就保存在 long 中。
2.资源类型咋表现的呢?资源在 PHP 内部其实就是一数字。详细后续会介绍。
3.refcount 和 is_ref 是干嘛的呢?呵呵,这就是第二部分要介绍的了。
Reference counting & Copy-on-Write
PHP 和其他语言类似,在其语法中有两种赋值方式:引用赋值和非引用赋值(普通的==
赋值
)。
<?php
$a = 1;
$b = $a;//非引用赋值
$c = &$a;//引用赋值
?>
引用赋值和非引用赋值在
PHP 内部是如何实现的呢?一种通常的认识是:“引用赋值就
是两个变量对应同一个
Zval,非引用赋值则是直接产生一个新的 zval,同时把对应的值直
接
copy 过来。”也就是该代码的内存结构如下:
(该图是大多数人认为的 PHP 内存结构,是错误的)
这样的确能够满足大部分情况下的需求,但显然不是最佳的解决方案,尤其是在内存
管理上,比如说以下代码就会显得非常的低效。
<?php
$arr = array(...);//定义一个非常大的 PHP 数组
myfunc($arr);//每一个函数调用都是一次隐性的非引用赋值
myfunc($arr);
?>
因为每次函数调用会进行一次内存
dump,而大内存的内存 dump 是非常耗 CPU 的。在