资讯专栏INFORMATION COLUMN

(PHP7内核剖析-4) 局部变量,全局变量,常量

yagami / 2892人阅读

摘要:局部变量中局部变量分配在结构上,每次执行都会生成一个新的,局部变量在执行之初分配,然后在执行结束时释放,这是局部变量的生命周期。

1.局部变量

PHP中局部变量分配在zend_execute_data结构上,每次执行zend_op_array都会生成一个新的zend_execute_data,局部变量在执行之初分配,然后在执行结束时释放,这是局部变量的生命周期。
读写操作:局部变量通过编译时确定的编号进行读写操作


2.静态变量

静态变量的保存位置:zend_op_array->static_variables,这是一个哈希表,所以PHP中的静态变量与普通局部变量不同,它们没有分配在执行空间zend_execute_data上,而是以哈希表的形式保存在zend_op_array中。静态变量只会初始化一次,注意:它的初始化发生在编译阶段而不是执行阶段,这个特性也意味着静态变量初始的值不能是变量,比如:static $count = $xxx;这样定义将会报错
读写操作:首先根据变量名在static_variables中取出对应的zval,然后将它修改为引用类型并赋值给局部变量,也就是说static $count = 4;包含了两个操作,严格的将$count并不是真正的静态变量,它只是一个指向静态变量的局部变量,执行时实际操作是:$count = & static_variables["count"];


3.全局变量

全局变量在整个请求执行期间始终存在,它们保存在EG( executor_globals,Zend执行器相关的全局变量)的symbol_table中,与静态变量的存储一样,这也是一个哈希表,在zend_execute_ex执行开始之前会把当前作用域下的所有全局变量添加到EG的symbol_table中.
读写操作:与静态变量的访问一样,全局变量也是将原来的值转换为引用,然后在global导入的作用域内创建一个局部变量指向该引用


4.常量

常量存储在EG的zend_constants哈希表中,访问时也是根据常量名直接到哈希表中查找
typedef struct _zend_constant {
    zval value;   //常量值
    zend_string *name; //常量名
} zend_constant;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28565.html

相关文章

  • (PHP7内核剖析-7) Zend引擎执行过程

    1.EG(executor_globals/zend_executor_globals) PHP整个生命周期中最主要的一个结构,是一个全局变量,在main执行前分配(非ZTS下),直到PHP退出,它记录着当前请求全部的信息 showImg(https://segmentfault.com/img/bV8fW0?w=960&h=777); 2.EX(execute_data/zend_execut...

    elisa.yang 评论0 收藏0
  • (PHP7内核剖析-5) PHP代码的编译

    摘要:代码的编译的解析过程任务就是将代码转化为数组,代码里的所有信息都保存在数组中,然后将数组交给引擎执行,就是内核具体执行的命令,比如赋值加减操作函数调用等,每一条都对应一个处理,这些是提前定义好的函数。 1.PHP代码的编译 PHP的解析过程任务就是将PHP代码转化为opcode数组,代码里的所有信息都保存在opcode数组中,然后将opcode数组交给zend引擎执行,opcode就是...

    DevTTL 评论0 收藏0
  • (PHP7内核剖析-8) 类

    摘要:父类方法为错误,成员方法不得被重写。父子类方法静态属性不一致父类方法为非静态而子类的是静态或相反,错误。 1.类的结构 类是编译阶段的产物,而对象是运行时产生的,它们归属于不同阶段。编译完成后我们定义的每个类都会生成一个zend_class_entry,它保存着类的全部信息,在执行阶段所有类相关的操作都是用的这个结构, struct _zend_class_entry { ch...

    JohnLui 评论0 收藏0
  • (PHP7内核剖析-3) 变量

    摘要:插入一个元素时先将元素按先后顺序插入数组,位置是,再根据的哈希值映射到散列表中的某个位置,将存入这个位置查找时先在散列表中映射到,得到在数组的位置,再从数组中取出元素。目前只有两种类型会使用这种机制。 1.变量结构 typedef struct _zval_struct zval; typedef union _zend_value { zend_long ...

    RiverLi 评论0 收藏0
  • (PHP7内核剖析-11) 模块扩展

    摘要:编译工具这个脚本主要生成了编译需要的配置以及扩展的基本结构这个脚本主要是获取的安装信息用于生成文件编写扩展的基本步骤通过目录下脚本生成扩展的基本框架修改配置设置编译配置参数设置扩展的源文件依赖库函数检查等等定义一个这样的编译参数 1. 编译工具 (a).ext_skel:这个脚本主要生成了编译需要的配置以及扩展的基本结构 (b).php-config:这个脚本主要是获取PHP的安装信息...

    gplane 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<