深刻理解PHP内核:变量及数据类型

一、现实生活中咱们会找一个小箱子来存放物品,一来显得不那么凌乱,二来方便之后找到。计算机也是这个道理,咱们须要先在内存中找一块区域,规定用它来存放数据,并起一个好记的名字,方便之后查找。这块区域就是“小箱子”,咱们能够把数据放进去了。java

二、数据类型用来讲明数据的类型,肯定了数据的解释方式,同时指明了数据的长度,也就是数据占用的字节数python

三、变量名就是给那块内存区域起了个名字,方便使用laravel

四、.从类型划分面试

1)静态类型语言:好比c/java,类型检查在编译器肯定sql

2)动态类型语言: 好比PHP/python,类型在运行时肯定shell

3)无类型语言: 好比汇编语言,对类型无知数据库

五、PHP变量类型及存储结构数组

PHP在声明或使用变量的时候,并不须要显式指明其数据类型。服务器

PHP是弱类型语言,这并不表示PHP没有类型,在PHP中,存在8种变量类型架构

标量类型: boolean、integer、float(double)、string

复合类型: array、object

特殊类型: resource、NULL

六、PHP变量存储结构

变量的值存储到如下所示zval结构体中

typedef struct _zval_struct zval;

struct _zval_struct {

/* Variable information */

zvalue_value value;     /* value */

zend_uint refcount__gc;

zend_uchar type;    /* active type */

zend_uchar is_ref__gc;

};
1)结构体是一种集合,它里面包含了多个变量或数组,它们的类型能够相同,也能够不一样,每一个这样的变量或数组都称为结构体的成员(Member),使用结构体(Struct)来存放一组不一样类型的数据

七、PHP变量类型

zval结构体的type字段就是实现弱类型最关键的字段了,type的值能够为: IS_NULL、IS_BOOL、IS_LONG、IS_DOUBLE、IS_STRING、IS_ARRAY、IS_OBJECT和IS_RESOURCE 之一。 从字面上就很好理解,他们只是类型的惟一标示,根据类型的不一样将不一样的值存储到value字段。 除此以外,和他们定义在一块儿的类型还有IS_CONSTANT和IS_CONSTANT_ARRAY。

这和咱们设计数据库时的作法相似,为了不重复设计相似的表,使用一个标示字段来记录不一样类型的数据。

八、PHP变量的值存储

变量的值存储在zvalue_value联合体中

typedef union _zvalue_value {

long lval;                  /* long value */

double dval;                /* double value */

struct {

    char *val;

    int len;

} str;

HashTable *ht;              /* hash table value */

zend_object_value obj;

} zvalue_value;
结构体和联合体的区别在于:结构体的各个成员会占用不一样的内存,互相之间没有影响;而联合体的全部成员占用同一段内存,修改一个成员会影响其他全部成员。

结构体占用的内存大于等于全部成员占用的内存的总和(成员之间可能会存在缝隙),联合体占用的内存等于最长的成员占用的内存。联合体使用了内存覆盖技术,同一时刻只能保存一个成员的值,若是对新的成员赋值,就会把原来成员的值覆盖掉。

1)通常类型

宏定义是预处理命令的一种,它容许用一个标识符来表示一个字符串#define 宏名 字符串

带参数宏定义对带参数的宏,在调用中,不只要宏展开,并且要用实参去代换形参。

2)字符串String

struct {

char *val;

int len;

} str;
C中字符串是以0结尾的字符数组,这里多存储了字符串的长度,这和咱们在设计数据库时增长的冗余字段殊途同归。 由于要实时获取到字符串的长度的时间复杂度是O(n),而字符串的操做在PHP中是很是频繁的,这样能避免重复计算字符串的长度, 这能节省大量的时间,是空间换时间的作法。

这么看在PHP中strlen()函数能够在常数时间内获取到字符串的长度。 计算机语言中字符串的操做都很是之多,因此大部分高级语言中都会存储字符串的长度。

1.其实在C语言中没有专门的字符串类型,咱们只能使用数组或者指针来间接地存储字符串。

2.字符数组其实是一系列字符的集合,也就是字符串(String),在C语言中,字符串老是以'0'做为串的结束符。数组的长度要比字符串的长度(字符串长度不包括 '0')大1

3.另一种表示字符串的方法,就是直接使用一个指针指向字符串,字符串中的全部字符在内存中是连续排列的,val指向的是字符串的第 0 个字符;咱们一般将第 0 个字符的地址称为字符串的首地址。字符串中每一个字符的类型都是char,因此 str 的类型也必须是char *

PHP的弱变量容器的实现方式是兼容并包的形式体现,针对每种类型的变量都有其对应的标记和存储空间。 使用强类型的语言在效率上一般会比弱类型高,由于不少信息能在运行以前就能肯定,这也能帮助排除程序错误。 而这带来的问题是编写代码相对会受制约。

以上内容但愿帮助到你们,不少PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提高,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货须要的能够免费分享给你们,须要
点击PHP进阶架构师>>>视频、面试文档免费获取

相关文章
相关标签/搜索