background image

  

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 的。在