PHP是弱语言,其变量处理的过程是不可见的。变量的存储似无形,又难以捉摸,到底存在了内存的哪里了?
每门计算机语言都需要一些容器来保存变量数据。在一些语言当中,变量都有特定的类型,如字符串,数组,对象等等。比如C和Pascal就属于这种。而PHP则没有这样的类型。在PHP中,一个变量在某一行是字符串,可能到下一行就变成了数字。变量可以经常在不同的类型间轻易的转化,甚至是自动的转换。PHP之所以成为一个简单并且强大的语言,很大一部分的原因是它拥有弱类型的变量。但是有些时候这也会带来一些有趣的问题。

在PHP内部,变量是存储在一个叫做zval的容器中。它不仅仅包含变量的值,也包含变量的类型。Python和PHP类似,也有一个标签标记变量类型。变量容器中包含一些Zend引擎用来区分是否引用的字段。同时它也包含这个值的引用计数。


直接赋值
<php>
  $a = 'zhangyu';
  $b = '男';
  $c = 27;
</php>

这里写图片描述


引用赋值
<php>
  $a = 'zhangyu';
  $b = $a;
  $c = $a;

  $adr_a = 'zhangyu';
  $adr_b = &$adr_a;
  $adr_c = &$adr_a;
</php>

铛铛铛…来了,这就是引用赋值的神奇之处,对于变量a和变量adr_a有无地址符号并没有什么不同,都是不同变量的指针指向了同一个地址,当遇到unset的时候,回收的并不是变量中的内存,而是链接中的指针关系,小汤被此处困扰很久,一度不能自拔,现在想想真是汗颜…
这里写图片描述

这里写图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐