以图明志

PHP服务器脚本

[专题] PHP内核探索:预定义变量

PHP脚本运行前将一些特殊变量加到符号表
大家都知道PHP脚本在执行的时候用户全局变量(在用户空间显式定义的变量)会保存在一个HashTable数据类型的符号表(symbol_table)中, 在PHP中有一些比较特殊的全局变量例如: $_GET,$_POST,$_SERVER等变量,我们并没有在程序中定义这些变量,并且这些变量也同样保存在符号表中, 从这些表象我们不难得出结论:PHP是在脚本运行之前就将这些特殊的变量加入到了符号表中了。

PHP服务器脚本

[专题] PHP内核探索:变量的检索

zend_hash_find()函数
用户在PHP语言里定义的变量,我们能否在内核中获取到呢?答案当然是肯定的,下面我们就看如何通过zend_hash_find()函数来找到当前某个作用域下用户已经定义好的变量。zend_hash_find()函数是内核提供的操作HashTable的API之一,如果你没有接触过,可以先记住这么使用就可以了。

PHP服务器脚本

[专题] PHP内核探索:变量的类型转换

内核提供了函数专门来实现类型转换
现在我们已经可以从符号表中获取用户在PHP语言里定义的变量了,是该做点其它事的时候了,举个比例,比如给它来个类型转换:-)。内核中提供了好多函数专门来帮我们实现类型转换的功能,你需要的只是调用一个函数而已。这一类函数有一个统一的形式:convert_to_*()

PHP服务器脚本

[专题] PHP内核探索:弱类型变量的实现

如何用C实现这种弱类型?
PHP是弱类型,动态的语言脚本。在申明一个变量的时候,并不需要指明它保存的数据类型。动态变量,在运行期间是可以改变的,并且在使用前无需声明变量类型。那么,问题一、Zend引擎是如何用C实现这种弱类型的呢?实际上,在PHP中声明的变量,在ZE中都是用结构体zval来保存的。

PHP服务器脚本

[专题] PHP内核探索:静态变量的实现

它的值不会在函数调用结束后释放
通常意义上静态变量是静态分配的,他们的生命周期和程序的生命周期一样, 只有在程序退出时才结束期生命周期,这和局部变量相反,有的语言中全局变量也是静态分配的。 例如PHP和Javascript中的全局变量。最常见的是静态局部变量及静态成员变量。局部变量只有在函数执行时才会存在。

PHP服务器脚本

[专题] PHP内核探索:变量类型提示

有时需要判断传递到方法中的参数
PHP是弱类型语言,向方法传递参数时候也并不严格检查数据类型。 不过有时需要判断传递到方法中的参数,为此PHP中提供了一些函数,来判断数据的类型。 比如is_numeric(),判断是否是一个数值或者可转换为数值的字符串,比如用于判断对象的类型运算符:instanceof。 instanceof 用来测定一个给定的对象是否来自指定的对象类。

PHP服务器脚本

[专题] PHP内核探索:变量的生命周期

变量的定义方式以及作用域
通过前面章节的描述,我们已经知道了PHP中变量的存储方式--所有的变量都保存在zval结构中。 下面介绍一下PHP内核如何实现变量的定义方式以及作用域。在ZE进行词法和语法的分析之后,生成具体的opcode,这些opcode最终被execute函数(Zend/zend_vm_execute.h:46)解释执行。

PHP服务器脚本

[专题] PHP内核探索:变量赋值与销毁

赋值操作的同时已经进行声明操作
在强类型的语言当中,当使用一个变量之前,我们需要先声明这个变量。然而,对于PHP来说, 在使用一个变量时,我们不需要声明,也不需要初始化,直接对其赋值就可以使用,这是如何实现的?在PHP中没有对常规变量的声明操作,如果要使用一个变量,直接进行赋值操作即可。在赋值操作的同时已经进行声明操作。

PHP服务器脚本

[专题] PHP内核探索:变量作用域

变量的作用域是变量的一个作用范围
变量的作用域是变量的一个作用范围,在这个范围内变量为可见的,即可以访问该变量的代码区域, 相反,如果不在这个范围内,变量是不可见的,无法被调用。 (全局变量可以将作用范围看作为整个程序) 如下面的例子:(会输出什么样的结果呢?)由此可见,变量的作用域是一个很基础的概念,在变量的实现中比较重要。

PHP服务器脚本

[专题] PHP内核探索:诡异的变量名

神秘的变量名特性
在PHP语言中,变量都是保存在哈希表中,称为变量符号表,其中变量名为哈希表的键,变量名对应的容器zval的指针为哈希表中的值。所有全局变量放在一张主符号表中(也就是数组$GLOBALS对应的哈希表)。PHP语言有个特性,变量在命名时,$变量标识符后不能以数字开头。

PHP服务器脚本

[专题] PHP内核探索:变量的value和type存储

变量的内部存储:值和类型
PHP是一种弱类型的脚本语言,弱类型不表示PHP的变量没有类型区分,PHP变量有8种原始类型:boolean(布尔型),integer(整型),float(浮点型),string(字符串)。一个变量能在运行期间从一种类型转换为另一种类型,那么PHP是如何实现这种变量的类型戏法的呢?

PHP服务器脚本

[专题] PHP内核探索:全局变量Global

Global语句解析过程
global语句的作用是定义全局变量,例如如果想在函数内访问全局作用域内的变量则可以通过global声明来定义。 下面从语法解释开始分析。查看 Zend/zend_language_scanner.l文件,搜索 global关键字。我们可以找到如下代码:……

PHP服务器脚本

[专题] PHP内核探索:变量类型的转换

隐式类型转换与强制类型转换
PHP是弱类型的动态语言,在前面的章节中我们已经介绍了PHP的变量都存放在一个名为ZVAL的容器中, ZVAL包含了变量的类型和各种类型变量的值。 PHP中的变量不需要显式的数据类型定义,可以给变量赋值任意类型的数据, PHP变量之间的数据类型转换有两种:隐式和显式转换。

PHP服务器脚本

[专题] PHP内核探索:内存管理开篇

尽可能高效的利用内存
内存是计算机非常关键的部件之一,是暂时存储程序以及数据的空间,CPU只有有限的寄存器可以用于存储计算数据,而大部分的数据都是存储在内存中的,程序运行都是在内存中进行的。和CPU计算能力一样, 内存也是决定计算效率的一个关键部分。计算中的资源中主要包含:CPU计算能力,内存资源以及I/O。

PHP服务器脚本

[专题] PHP内核探索:Zend内存管理器

非常类似于操作系统的内存管理功能
每个平台操作内存的方式都是差不多的有两个方面,一负责申请,二负责释放。如果应用程序向系统申请内存,系统便会在内存中寻找还没有被使用的地方,如果有合适的,便分配给这个程序,并标记下来,不再给其它的程序了。如果一个内存块没有释放,而所有者应用程序也永远不再使用它了。那么,我们就称其为"内存泄漏",那么这部分内存就无法再为其它程序所用了。

PHP服务器脚本

[专题] PHP内核探索:PHP的内存管理

在ZEND内核中以宏的形式作为接口提供
PHP的内存管理可以被看作是分层(hierarchical)的。 它分为三层:存储层(storage)、堆层(heap)和接口层(emalloc/efree)。 存储层通过 malloc()、mmap() 等函数向系统真正的申请内存,并通过 free() 函数释放所申请的内存。 存储层通常申请的内存块都比较大,这里申请的内存大并不是指storage层结构所需要的内存大。
3 / 7 首页 < Prev 1 2 3 4 5 Next > 尾页 页码: