php数据类型底层结构 php 基本数据类型

PHP变量的底层实现我们解压PHP的源码包, 看到如下的目录
其中,
最核心的---Zend目录, 这是zend虚拟的实现. 包括栈,数据类型,编译器等,都在这实现.
最主要的main --PHP的一些内建函数,最主要函数都在这里放着.
最大的一个目录ext -- PHP的扩展.
PHP的大部分功能,都是以extenstion形式来完成的.
如果你开发了一个扩展,也放在ext目录下.
Zend对变量的表示:
答: zend实现了 zval结构体
{
value: [联合体] ,联合体的内容可能是C语言中的long,double,hashtable...
type:变量类型 , IS_NULL,IS_BOOL,IS_STRING...... IS_RESOURCE
refcount_gc
is_ref_gc
}
如:
$a = 3;
{
value : [long lval = 3]
type: IS_LONG
}
$a = 3.5
{
value: [double dval = 3.5]
type:IS_DOUBLE
疑问:
PHP中有8种数据类型,为什么zval-value 联合体中,只有5种?
答:
1: NULL,直接 zval-type = IS_NULL,就可以表示,不必设置value的值.
2: BOOL型 , zval-type = IS_BOOL, 再设置 zval.value.lval = 1/0;
3: Resourc型 ,资源型 往往是服务器上打开的一个接口,如果 文件读取接口.
zval-type = IS_RESOURCE, zval-tyoe.lval =服务器上打开的接口的编号
发现:
PHP中,字符串类型,长度是已经缓存的,调用strlen时,系统可以直接返回其长度,不必计算.
PHP数据类型怎么讲PHP的数据类型主要涵盖如下php数据类型底层结构:
一、四种标量类型(只能存储一个数据)php数据类型底层结构:
string (字符串)、boolean (布尔型)、integer (整型)、float (浮点型, 也称 double)
二、两种复合类型:
array (数组)、object (对象)
三、两种特殊类型:
resource(资源)、null (null)
PHP的数据类型有哪些?每种数据类型适用于哪些应用场合?借用“短发人”的数据,手工完善一下 。
boolean (布尔型)一般用于判断,true或false 。比如是否检测,是否完成,是否毕业等 。
integer (整型)一般用于年龄 , 数量等没有小数点的计算 。比如1 2 33 -9等 。
float (浮点型, 也称作 double) 一般用于金钱,面积、体积等科学,含小数点的计算 。比如3.1415926585897932
string (字符串)一般用于人名,物品等常规字符串 。比如“张三”“桌子”“我来了”
array (数组)一般用于复杂数据处理 , 可以多维数据结构,可以放布尔、整型、浮点、字符、数组等 。
object (对象) 一般用于面向对象,里面包含方法和变量 。
php中字符串怎么又可以当作数组了?一句话解释就是“PHP中下标符号可应用于数组,对象和字符串”
PHP中有几种主要的数据类型,通俗的解释一下他们数据类型有三种:
1.标量数据类型
标量数据类型包括以下几种 。
(1)booleanphp数据类型底层结构:布尔型
布尔变量是PHP变量中最简单php数据类型底层结构的 。它保存一个True或者False值 。其中True或者False是PHP的内部关键字 。设定一个布尔型的变量php数据类型底层结构,只需将True或者False赋值给该变量
(2)string:字符串
字符串是连续的字符序列php数据类型底层结构,字符串中的每个字符只占用一个字节 。在PHP中,定义字符串有3种方式:
单引号方式 ,
双引号方式,
Heredoc方式 。
(3)integer:整数
整数数据类型只能包含整数 。这些数据类型可以是正数或负数 。在32位的操作系统中,有效的范围是?2 147 483 648~ 2 147 483 647 。
(4)double:浮点数
浮点数据类型可以用来存储数字,也可以保存小数 。它提供的精度不整数大得多 。在32位的操作系统中,有效的范围是1.7E-308~1.7E 308 。
2.复合数据类型
复合数据类型包括以下两种 。
(1)array:数组
可以是二维、三维或者多维,数组中的各元素可以是string、integer或double , 也可以是array 。
(2)object:对象类型
3.特殊数据类型
特殊数据类型包括以下两种 。
(1)resource:资源
资源是PHP内的几个函数所需要的特殊数据类型,由编程人员来分配 。
(2)null:空值
空值是最简单的数据类型 。表示没有为该变量设置任何值,另外 , 空值(NULL)不区分大小写 。
PHP 数组的底层实现PHP 数组的底层主要是通过 HashTable 实现,HashTable 通过映射函数或者散列函数将 String Key 转换成一个普通的数字下标,然后再将 Value 值存储到下标对应的数组元素中
HashTable 主要包含两部分:1.存储元素的数组 2.散列函数或者映射函数
随机访问
如果我们指定一个 Key=Value 的映射关系,Key 是一个 String 类型的,则先通过 Time 33 算法将 String 转换成一个 Int 整型,然后再通过 PHP 里面特定的散列算法映射成 Bucket 数组中的一个下标,将 Value 值存储到对应的下标元素中,当我们通过 Key 访问数组元素时,只需要再通过相同的算法计算出对应的 Key,就能实现随机访问数组元素
顺序访问
存储在 HashTable 中的数组是无序的 , 但是 PHP 中的数组是有序的,为了实现 HashTable 的有序性,PHP 引入了一个中间映射表 , 该表是一个大小和 Bucket 数组相同的数组,数组中存放的是整形数据,主要用于存放元素实际存储的 Value 的下标值 , 当引入中间映射表之后,Bucket 中的数据是有序的,而中间映射表中的数据是无序的 , 当我们顺序访问的时候只需要遍历 Bucket 中的数据即可
Hash 冲突
PHP 解决 Hash 冲突采用的是链地址法,将出现冲突的 Bucket 串成链表,这样通过中间映射表映射出来的就不再是一个元素而是一个链表 , 通过散列函数定位到对应的 Bucket 链表时,需要遍历链表,逐个对比 key 值 , 直至找出对应的目标值
PHP 实现扩容
1.当删除的元素所占比例超出阈值的时候,则需要移除已经被逻辑删除的 Bucket,将后面的 Bucket 补位到前面,因为 Bucket 的下标发生了变动,所以需要更新每元素在中间映射表中实际存储的下标值
2.当没有超出阈值的时候,PHP 会申请一个大小是原来两倍的新数组,并将旧数组中的数据复制到新数组中,因为数组长度发生了变化,所以 key-value 的映射关系需要重新计算,这个就是重建索引
【php数据类型底层结构 php 基本数据类型】关于php数据类型底层结构和php 基本数据类型的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读