php 能获取每台电脑的唯一值_深入理解PHP内核:变量及数据类型

本文详细介绍了PHP中的变量存储结构和类型系统。PHP变量不需要显式声明类型,使用zval结构体存储,其中type字段标识变量类型,如IS_NULL、IS_BOOL等。变量值存储在zvalue_value联合体中,利用内存覆盖技术。PHP的弱类型特性允许在运行时动态转换类型,但可能影响效率。此外,还提到了C语言中字符串的表示和存储方式。
摘要由CSDN通过智能技术生成

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

2、数据类型用来说明数据的类型,确定了数据的解释方式,同时指明了数据的长度,也就是数据占用的字节数

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

4、.从类型划分

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

2)动态类型语言: 比如PHP/python,类型在运行时确定

3)无类型语言: 比如汇编语言,对类型无知

5、PHP变量类型及存储结构

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

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

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

复合类型: array、object

特殊类型: resource、NULL

6、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)来存放一组不同类型的数据

7、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。

这和我们设计数据库时的做法类似,为了避免重复设计类似的表,使用一个标示字段来记录不同类型的数据。

8、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)一般类型

17db0a8b455eb188dcc04b3f02fbece2.png

宏定义是预处理命令的一种,它允许用一个标识符来表示一个字符串#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进阶架构师>>>视频、面试文档免费获取​docs.qq.com
56e2918d1e37c4c837d265a8915caaaf.png

或 者关注咱们下面的知乎专栏

PHP架构师圈子​zhuanlan.zhihu.com
dbf4b4a24ca905fb8a89ede6c9d46c7c.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值