PHP内核探索:变量存储和类型使用说明

首先,回答上一节中的问题。

复制代码代码如下所示:
< PHP
$=10;
$ bar = 20;

函数更改(){
全局$;
函数内部;
如果您不将$ bar定义为全局变量,则体函数不能访问$ bar。
$ bar = 0;
$ + +;
}

变化();
$、$、$条;
>


程序输出1120。原因是在该方法中不能访问$ bar变量,所以它的值仍然是20。在使用全局之后,可以得到$的值,而$的值是11。
全局的作用是定义全局变量,但是这个全局变量不应用于整个网站,而是应用于当前页面,包括所有包含或需要的文件。
序言是指变量的三个基本特征,其中一个是变量类型,变量有特定类型,如字符串、数组和对象等。程序语言的类型系统可分为强和弱两种类型。
强类型语言是一旦一个变量被声明为一个类型的变量,在程序运行时,它不能被外部变量类型的值赋给它(当然不完全,这可能与该类型的转换,下一节将有相应的介绍,C / C + + + / java语言等)就属于这一类。
PHP和Ruby、Javascript和其他脚本语言属于弱类型语言:变量可以表示任何数据类型。
PHP之所以是一种简单而强大的语言,有很大一部分原因是它有一个弱类型的变量,但在某些情况下,它也是一把双刃剑,误用也会带来一些问题。
在官方的PHP实现,所有的变量都使用相同的数据结构保存(机制),同时代表不同的数据类型在PHP。它不仅包含该变量的值,而且该类型的变量,这是PHP弱型芯。
如何在zval结构并实现弱类型,让我们一起揭开面纱。
变量的存储结构
当一个PHP声明或使用一个变量时,它不需要显式指定它的数据类型。
PHP是一种弱类型语言,但这并不意味着没有PHP类型。在PHP中,有8种类型的变量,可以分为三类。
*标量类型:布尔值、整数、浮点数(double)、字符串
*复合类型:数组、对象
*特殊类型:资源,null
官方的PHP是用C来实现的,而C是一种强大的语言,它是如何实现PHP中的弱类型的呢
该变量的值存储在zval结构。在zval结构是Zend / Zend定义。h文件,其结构如下:

复制代码代码如下所示:
_zval_struct zval结构定义;

结构_zval_struct {
变量信息
zvalue_value值; / * * /
zend_uint refcount__gc;
zend_uchar型活跃型; / * * /
zend_uchar is_ref__gc;
};


PHP使用这种结构来存储变量的所有数据,与其他编译静态语言不同,PHP在存储变量时将PHP类型的用户空间保存在相同的结构中,这样我们就可以通过这个信息获得变量的类型。
有在zval结构四个领域,其意义是:







属性名称
意义
默认值


refcount__gc
代表引用计数


is_ref__gc
指示是否被引用


价值
存储变量的值。



变量的具体类型
PHP5.3后,介绍了一种新型的垃圾收集机制,和计数引用字段名称改为refcount__gc和is_ref__gc.before这是引用计数和is__ref。

变量的值是存储在另一个结构,zvalue_value.the值存储,如下所示。
PHP的用户空间指的是PHP语言,在这本书中,大部分的书都是探索PHP实现,这些实现可以理解为内核空间,因为PHP是用C语言实现,这个空间范围仅限于C language.php用户空间局限于PHP语法和功能范围。例如,一些PHP扩展提供了一些PHP的函数或类,并已出口到PHP的用户空间的方法或类。
变量类型
机制的结构类型字段来实现弱型最关键的领域。类型的值可以是一个is_null,is_bool,is_long,is_double,is_string,is_array,is_object和is_resource.it是从字面上理解,他们是唯一的类型的唯一标志,和不同的值是根据类型存储在价值领域。此外,所定义的类型和他们在一起是is_constant和is_constant_array。
这类似于我们如何设计数据库。为了避免重复类似表的设计,使用标签字段记录不同类型的数据。

变量的值存储
上面提到的值存储在zvalue_value财团,和结构定义如下:

复制代码代码如下所示:
_zvalue_value { typedef联盟
长语句长值; / * * /
双双双值; / * * /
struct {
字符*;
Int len;
STR };
哈希表*哈希表值; / * * /
zend_object_value obj;
zvalue_value };


由于空间变量只能同时属于一种类型,所以使用一个联合体代替结构来使用空间,如果我们使用结构,就不必浪费空间,而PHP中的所有逻辑都是围绕变量进行的。在这种情况下,内存浪费将非常大,这是一个小成本,但一个巨大的利润。
各种类型的数据使用不同的方法存储变量的值,相应的赋值方法如下所示:

1。一般类型





变量类型




布尔
zval_bool
布尔和整数变量的值存储在(机制)。Value.lval,和他们的类型也存储在相应的is_ *。
z_type_p(Z)= is_bool /长;z_lval_p(z)=((B)!= 0);

整数
zval_long


zval_double

无效的
zval_null
对空值的变量的值不需要存储,但(机制)。Type只需要被标记为is_null。
z_type_p(Z)= is_null;

资源
zval_resource
资源类型的存储与其他一般变量不一样,但它们的初始化和访问是不同的。
z_type_p(Z)= is_resource;z_lval_p(Z)= L;
2。串刺
字符串的类型与其他任何数据类型相同,但字符串存储时有一个字符串长度字段。

复制代码代码如下所示:
struct {
字符*;
Int len;
STR };


在C中,字符串是以 0结束的字符数组。字符串的长度是存放在这里,这是作为冗余字段相同,我们增加数据库设计时,由于获取实时的字符串长度的时间复杂度为O(N),和字符串操作在PHP非常频繁,可避免字符串的长度重复计算,从而节省了大量的时间,是一种改变时间空间。所以strlen()函数在PHP可以在常数时间的字符串的长度。在计算机语言中,字符串操作的非常多,所以一个字符串的长度存储在最先进的语言。

三.阵列

数组是最常用和最强大的PHP变量类型,它可以存储其他类型的数据,并提供多种内置的操作功能。数组的存储比其他因素更为复杂,和数组的值存储在zvalue_value.ht领域,这是一个哈希表的数据类型。PHP数组使用一个哈希表来存储相关的数据。一个哈希表是一种有效的键-值对的存储结构,数据结构,哈希表和水桶,用于PHP的哈希表的实现。在PHP中所有的工作都是用哈希表实现的,在哈希表中的下一部分对哈希表的基本概念的介绍和PHP的哈希表的实现。

4。对象的对象

在面向对象的语言中,我们可以定义我们需要的数据类型,包括类的属性、方法等,对象是类的具体实现,对象有自己的状态和可以完成的操作。
PHP的对象是一个数据的复合型,这是存储一个zend_object_value.its定义结构如下:

复制代码代码如下所示:
_zend_object_value { typedef struct
zend_object_handle处理; / / unsigned int型EG(objects_store)object_buckets指数。
zend_object_handlers *处理;
zend_object_value };


PHP的对象只在运行时创建的,和上一节介绍了如宏,这是一个用来在运行时保存数据的全局结构。包括保存对象池的所有对象的创建,如(objects_store),和zend_object_handle域对象的价值内容索引中的对象池当前对象,处理场处理函数对象操作保持。这种结构的结构和对象相关的类,_zend_class_entry介绍后。
PHP弱变容器实现体现在包罗万象的各类型变量的形式,有其相应的标记和存储空间,使用强类型语言通常比弱型效率更高,因为很多信息可以确定在运行,这也有助于消除程序错误。问题是,写代码比较约束。

PHP的主要用途是作为一个Web开发语言,和在普通的Web应用,瓶颈往往对业务和数据层访问。但语言也可以在大型应用的一个关键因素。脸谱网因此使用自己的PHP实现,编译PHP到C++代码来提高性能。然而,脸谱网是不是一个完整的PHP实现。因为它直接编译PHP到C++,有PHP的一些动态特性,如eval结构。当然,有一种方法来实现它,和HIPHOP应该权衡。