foreach操作若何实现?对一个数组的foreach就是经由过程遍历hashtable中的双向链表完成。对于索引数组,经由过程foreach遍历效力比for高很多,省去了key->value的查找。count操作直接调用HashTable->NumOfElements,O(1)操作。对于’123’如许的字符串,zend会转换为颇┞符数情势。$arr[‘123’]和$arr[123]是等价的。
- getKeyHashValue h;
- index = n & nTableMask;
- Bucket *p = arBucket[index];
- while (p) {
- if ((p->h == h) & (p->nKeyLength == nKeyLength)) {
- RETURN p->data;
- }
- p=p->next;
- }
- RETURN FALTURE;
- PHP索引数组:索引数组就是我们常见的数组,经由过程下标拜访。例如 $arr[0],Zend HashTable内部进行了归一化处理,对于index类型key同样分派了hash值和nKeyLength(为0)。内部成员变量nNextFreeElement就是当前分派到的最大年夜id,每次push后主动加一。恰是这种归一化处理,PHP才能够实现接洽关系和非接洽关系的混淆。因为push操作的特别性,索引key在PHP数组中先后次序并不是经由过程下标大年夜小来决定,而是由push的先后决定。例如 $arr[1] = 2; $arr[2] = 3;对于double类型的key,Zend HashTable会将他当做索引key处理
6. PHP变量
PHP是一假日类型说话,本身不严格区分变量的类型。PHP在变量申明的时刻不须要指定类型。PHP在法度榜样运行时代可能进行变量类型的隐示转换。和其他强类型说话一样,法度榜样中也可以进行显示的类型转换。PHP变量可以分为简单类型(int、string、bool)、集合类型(array resource object)和常量(const)。以上所有的变量在底层都是同一种构造 zval。
Zval是zend中另一个异常重要的数据构造,用来标识并实现PHP变量,其数据构造如下:
Zval重要由三部分构成:
- type:指定了变量所述的类型(整数、字符串、数组等)
- refcount&is_ref:用来实现引用计数(后面具体介绍)
- value:核心部分,存储了变量的实际数据
Zvalue是用来保存一个变量的实际数据。因为要存储多种类型,所以zvalue是一个union,也由此实现了弱类型。
如前所述,Sapi经由过程经由过程一系列的接口,使得外部应用可以和PHP交换数据并可以根据不合应用特点实现特定的处理办法。
PHP变量类型和其实际存储对应关系如下:
- IS_LONG -> lvalue
- IS_DOUBLE -> dvalue
- IS_ARRAY -> ht
- IS_STRING -> str
- IS_RESOURCE -> lvalue
引用计数在内存收受接收、字符串操作等处所应用异常广泛。PHP中的变量就是引用计数的典范应用。Zval的引用计数经由过程成员变量is_ref和ref_count实现,经由过程引用计数,多个变量可以共享同一份数据。避免频繁拷贝带来的大年夜量消费。
在进行赋值操作时,zend将变量指向雷同的zval同时ref_count++,在unset操作时,对应的ref_count-1。只有ref_count减为0时才会真正履行烧毁操作。如不雅是引用赋值,则zend会修改is_ref为1。
PHP变量经由过程引用计数实现变量共享数据,那如不雅改变个一一个变量值呢?当试图写入一个变量时,Zend若发明该变量指向的zval被多个变量共享,则为其复制一份ref_count为1的zval,并递减原zval的refcount,这个过程称为“zval分别”。可见,只有在有写操作产生时zend才进行拷贝操作,是以也叫copy-on-write(写时拷贝)
对于引用型变量,其要乞降非引用型相反,引用赋值的变量间必须是绑缚的,修改一个变量就修改了所有绑缚变量。
整数、浮点数是PHP中的基本类型之一,也是一个简单型变量。对于整数和浮点数,在zvalue中直接存储对应的值。其类型分别是long和double。
大年夜图上可以看出,PHP大年夜下到上是一个4层体系:
- Zend引擎:Zend整体用纯C实现,是PHP的内核部分,它将PHP代码翻译(词法、语法解析等一系列编译过程)为可履行opcode的处理并实现响应的处理办法、实现了根本的数据构造(如hashtable、oo)、内存分派及治理、供给了响应的api办法供外部调用,是一切的核心,所有的外围功能均环绕Zend实现。
- Extensions:环绕着Zend引擎,extensions经由过程组件式的方法供给各类基本办事,我们常见的各类内置函数(如array系列)、标准库等都是经由过程extension来实现,用户也可以根据须要实现本身的extension以达到功能扩大、机能优化等目标(如贴吧正在应用的PHP中心层、富文本解析就是extension的典范应用)。
推荐阅读
本文构造: 什么是定名实体辨认(NER) 怎么辨认?cs224d Day 7: 项目2-用DNN处理NER问题课程项目描述地址什么是NER?定名实体辨认(NER)是指辨认文本中具有特定意义的实体,重>>>详细阅读
本文标题:PHP底层的运行机制与原理解析
地址:http://www.17bianji.com/lsqh/35498.html
1/2 1