聊聊php数组底层是如何实现的(php数组是怎么实现的)

本文目录一览:

PHP的数组底层是怎么实现的

PHP之所以发现这么迅速,有很大原因是因为数组数据非常好处理,而且它可以存储其他类型的数据

数组的值存储在zvalue_value.ht字段中,ht是一个HashTable的数据

有关于HashTable的知识请移步 HASH表和变量

我们来详细说一下数组

PHP里面所有的数据都离不开zval和HashTable,

一个PHP很简单的数组初始化,

在C语言里面实现的却没有那么简单.

经过简单分析,找到数组的初始化的opcode

求各位大神帮帮忙,PHP $_post 数组 怎么实现

有点没看明白你提问的目的!

php数组的定义很宽泛,不需要预先定义变量,可以直接存放数据,有两种形式:索引数组(不指定键,系统自动分配数字键)、关联数组(自定义键,指定键)!

例如:想要获得如下结构的二维数组(关联数组)

[

  ‘A’ = [

        ‘type’ = ‘TYPE_SINGLE’, 

        ‘day’ = ‘DAY May 12’

        ], 

  ‘B’ = [

        ‘type’ = ‘TYPE SINGLE_2’, 

        ‘day’ = ‘DAY May 13’

        ],

  ‘C’ = [

        ‘type’ = ‘TYPE SINGLE_3’, 

        ‘day’ = ‘DAY May 14’

        ]

]

php定义代码:

//第1种

$abc = [

  ‘A’ = [

        ‘type’ = ‘TYPE_SINGLE’, 

        ‘day’ = ‘DAY May 12’

        ], 

  ‘B’ = [

        ‘type’ = ‘TYPE SINGLE_2’, 

        ‘day’ = ‘DAY May 13’

        ],

  ‘C’ = [

        ‘type’ = ‘TYPE SINGLE_3’, 

        ‘day’ = ‘DAY May 14’

        ]

];

//第2种

$abc2 = [];//定义并重置变量,此行可不写

$abc2[‘A’][‘type’] = ‘TYPE_SINGLE’;

$abc2[‘A’][‘day’] = ‘DAY May 12’;

$abc2[‘B’][‘type’] = ‘TYPE_SINGLE_2’;

$abc2[‘B’][‘day’] = ‘DAY May 13’;

$abc2[‘C’][‘type’] = ‘TYPE SINGLE_3’;

$abc2[‘C’][‘day’] = ‘DAY May 14’;

//第3种(1、2的混合用法)

$abc3[‘A’] = [‘type’ = ‘TYPE_SINGLE’, ‘day’ = ‘DAY May 12’];

$abc3[‘B’] = [‘type’ = ‘TYPE_SINGLE_2’, ‘day’ = ‘DAY May 13’];

$abc3[‘C’] = [‘type’ = ‘TYPE_SINGLE_3’, ‘day’ = ‘DAY May 14’];

以上三种写法是常用写法,还有其他形式,php数组功能很强大,可以存放任意数据类型,写法也很随意!$abc、$abc2、$abc3 数据结构相同,但是$abc会重置内部结构。

注:$_POST 是全局变量,适合从中获取(请求)数据,不建议你修改其内部数据结构,防止键名冲突,破坏全局变量的结构。如果你修改了$_POST,的确,$_POST[‘A’][‘type’] 能得到字符串’TYPE_SINGLE’!

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时,系统可以直接返回其长度,不必计算.

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/248956.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2024-12-12 13:30
下一篇 2024-12-12 13:30

相关推荐

  • Python导入数组

    本文将为您详细阐述Python导入数组的方法、优势、适用场景等方面,并附上代码示例。 一、numpy库的使用 numpy是Python中一个强大的数学库,其中提供了非常丰富的数学函…

    编程 2025-04-29
  • Python返回数组:一次性搞定多种数据类型

    Python是一种多用途的高级编程语言,具有高效性和易读性的特点,因此被广泛应用于数据科学、机器学习、Web开发、游戏开发等各个领域。其中,Python返回数组也是一项非常强大的功…

    编程 2025-04-29
  • 如何实现图像粘贴到蒙版

    本文将从多个方面介绍图像粘贴到蒙版的实现方法。 一、创建蒙版 首先,在HTML中创建一个蒙版元素,用于接收要粘贴的图片。 <div id=”mask” style=”widt…

    编程 2025-04-29
  • Python去掉数组的中括号

    在Python中,被中括号包裹的数据结构是列表,列表是Python中非常常见的数据类型之一。但是,有些时候我们需要将列表展开成一维的数组,并且去掉中括号。本文将为大家详细介绍如何用…

    编程 2025-04-29
  • Python操作数组

    本文将从多个方面详细介绍如何使用Python操作5个数组成的列表。 一、数组的定义 数组是一种用于存储相同类型数据的数据结构。Python中的数组是通过列表来实现的,列表中可以存放…

    编程 2025-04-29
  • Django ORM如何实现或的条件查询

    在我们使用Django进行数据库操作的时候,查询条件往往不止一个,一个好的查询语句需要考虑我们的查询要求以及业务场景。在实际工作中,我们经常需要使用或的条件进行查询,本文将详细介绍…

    编程 2025-04-29
  • Python二维数组对齐输出

    本文将从多个方面详细阐述Python二维数组对齐输出的方法与技巧。 一、格式化输出 Python中提供了格式化输出的方法,可以对输出的字符串进行格式化处理。 names = [‘A…

    编程 2025-04-29
  • Java创建一个有10万个元素的数组

    本文将从以下方面对Java创建一个有10万个元素的数组进行详细阐述: 一、基本介绍 Java是一种面向对象的编程语言,其强大的数组功能可以支持创建大规模的多维数组以及各种复杂的数据…

    编程 2025-04-28
  • Python数组随机分组用法介绍

    Python数组随机分组是一个在数据分析与处理中常用的技术,它可以将一个大的数据集分成若干组,以便于进行处理和分析。本文将从多个方面对Python数组随机分组进行详细的阐述,包括使…

    编程 2025-04-28
  • Python数组索引位置用法介绍

    Python是一门多用途的编程语言,它有着非常强大的数据处理能力。数组是其中一个非常重要的数据类型之一。Python支持多种方式来操作数组的索引位置,我们可以从以下几个方面对Pyt…

    编程 2025-04-28

发表回复

登录后才能评论