Zend变量探索

2024-03-11 00:08
文章标签 变量 探索 zend

本文主要是介绍Zend变量探索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Zend变量探索

 

V2.0

 

taft@wjl.cn

 

最后更新 2006-1-27

 

[摘要] 本文介绍了作为PHP语言核心的Zend引擎对处理脚本变量的机制。

 

写过CC++或者是java代码肯定清楚,在使用变量的时候必须先定义一个变量,比如整型int、字符型char等等,这样在编译的时候编译器就会自动给变量划分相应的储存空间。先定义(有的还必须初始化)后使用是编译型语言的基本原则,否则编译的时候不能通过。解释型语言就没有这么“麻烦”了,想用什么变量按照命名规则使用就是了,不用声明。这的确很方便,特别适合初学计算机程序设计,如BASIC语言就是一个地道的解释型语言。大家可能会注意到,麻烦吗?是的,在解释型语言中变量的出生到灭亡都麻烦,做的工作不比编译型语言少。开放原代码的PHP同样是解释型语言。

1、   变量在Zend中的定义:

Zend的变量分内部变量(internal)和外部变量(external),内部变量主要是完成引擎动作或各扩展模块的“内部员工”,定义和c语言完全一样。外部变量是Zend引擎扫描到的PHP脚本文件里使用的变量和PHP函数的一部分形参变量,定义为zval。请看下面的定义:

typedef  struct _zval_struct   zval;

typedef  struct _zend_class_entry   zend_class_entry;

typedef union _zvalue_value {

    long lval;                  /* long value */

    double dval;                 /* double value */

    struct {

       char *val;

       int len;

    } str;

    HashTable *ht;              /* hash table value */

    struct {

       zend_class_entry *ce;

       HashTable *properties;

    } obj;

} zvalue_value;

struct _zval_struct {

    /* Variable information */

    zvalue_value value;      /* value */

    zend_uchar type;  /* active type  3*/

    zend_uchar is_ref;  /*是否为引用*/

    zend_ushort refcount;

};

zend.h

Zend用一个容器来处理所有的外部变量,这个容器就是上面定义的联合体(union_zvalue_value,它包含了常见的长整型(long),浮点双精度型(double),字符串型(结构体,分别有字符串首地址、字符串长度),Hash表,类结构体(如果你定义一个类,这个结构体就起作用了)。通常,在C++ 中容器被定义为一个以保存一批对象为主要用途的类。Zend变量容器的作用显然和C++有类似之处,根据用户不同的赋值,容器呈现不同的类型。Zend把外部变量封装在结构体_zal_struct里面,此结构体储存了变量的基本信息:变量值(value)、变量类型(type)、是否为引用(PHP4以上)、引用计数(PHP4以上)。定义一个外部变量如下:

     zval  my_zval, *pmy_zval;

引用一个变量的值:my_zval.value;取得变量类型:my_zval.type

还要提一点的是,这里的typeZend所定义的,而不是C语言里的原子类型。列出来如下:

/* data types */

#define IS_NULL                 0

#define IS_LONG                 1

#define IS_DOUBLE               2

#define IS_STRING               3

#define IS_ARRAY                4

#define IS_OBJECT               5

#define IS_BOOL                 6

#define IS_RESOURCE             7

#define IS_CONSTANT             8

#define IS_CONSTANT_ARRAY       9

zend.h 318行)

这些类型不用于定义变量,主要用作类型的判断。

下图更清楚地反映了相互的关系:

struct _zval_struct {

/* Variable information    zvalue_value value;      zend_uchar type; 

    zend_uchar is_ref;      zend_ushort refcount;

};

 

typedef union _zvalue_value {

    long lval;                   /* long value */

double dval;                 /* double value */

    struct {

       char *val;

       int len;

    } str;

    HashTable *ht;               /* hash table value */

    struct {

       zend_class_entry *ce;

       HashTable *properties;

    } obj;

} zvalue_value;

 

IS_NULL           0

IS_LONG           1

IS_DOUBLE         2

IS_STRING         3

IS_ARRAY          4

IS_OBJECT         5

IS_BOOL           6

IS_RESOURCE       7

IS_CONSTANT       8

IS_CONSTANT_ARRAY 9

 

 

2、变量在Zend中的创建

Zend扫描解释到外部变量并用zval定义之后,必须在内存中为此变量申请合适的空间,然后把变量添加到符号表中去,如果是全局变量,则添加到全局符号表中。首先Zend用到了一个宏:MAKE_STD_ZVAL

#define MAKE_STD_ZVAL(zv)               /   //分配新的ZVAL容器

    ALLOC_ZVAL(zv); /

    INIT_PZVAL(zv);

zend.h

此宏先调用ALLOC_ZVAL在内存中分配合适的空间,然后用INIT_PZVAL(zv)初始化变量:置容器引用计数(refcount)为1,是否为引用is_ref为否(0),

Zend的下一步工作是把变量添加到符号表里去,使用了宏 ZEND_SET_SYMBOL(symtable, name, var),它先检查这个值是否已经存在于符号表中,如果存在,将新符号转变为一个引用(reference)变量(并自动释放旧的zval容器)。

3、举 

最后在这里给出几个变量诞生的全过程:

假设用户在php脚本文件有个变量$new_long_name=100

Zend引擎的处理如下:

zval  *new_long;              //定义一个容器变量

MAKT_STD_ZVAL(new_long);      //为新变量开辟内存空间并初始化

new_long->type = IS_LONG;

new_long->value.lval = 100;

ZEND_SET_SYMBOL(EG(active_symbol_table),”new_long_name”,new_long);    //添加变量到符号表

ZEND_SET_SYMBOL使用EG宏存取Zend执行器全局变量。通过指定EG(active_symbol_table),可以访问当前活动符号表,处理活动且局部范围内的符号。根据函数调用的不同局部范围也会变化。

字符串的创建:

zval  *new_string;

char  *string_contents = “This is a new string variable”;

MAKE_STD_ZVAL(new_string);

new_string->type = IS_STRING;

new_string->value.str.len = strlen(string_contents);

new_string->value.str.val= estrdup(string_contents);

 

这篇关于Zend变量探索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/795969

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

轻松录制每一刻:探索2024年免费高清录屏应用

你不会还在用一些社交工具来录屏吧?现在的市面上有不少免费录屏的软件了。别看如软件是免费的,它的功能比起社交工具的录屏功能来说全面的多。这次我就分享几款我用过的录屏工具。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  这个软件的操作方式非常简单,打开软件之后从界面设计就能看出来这个软件操作的便捷性。界面的设计简单明了基本一打眼你就会轻松驾驭啦

深入探索嵌入式 Linux

摘要:本文深入探究嵌入式 Linux。首先回顾其发展历程,从早期尝试到克服诸多困难逐渐成熟。接着阐述其体系结构,涵盖硬件、内核、文件系统和应用层。开发环境方面包括交叉编译工具链、调试工具和集成开发环境。在应用领域,广泛应用于消费电子、工业控制、汽车电子和智能家居等领域。关键技术有内核裁剪与优化、设备驱动程序开发、实时性增强和电源管理等。最后展望其未来发展趋势,如与物联网融合、人工智能应用、安全性与

JS_变量

二、JS的变量 JS中的变量具有如下特征 1 弱类型变量,可以统一声明成var 2 var声明的变量可以再次声明 3 变量可以使用不同的数据类型多次赋值 4 JS的语句可以以; 结尾,也可以不用;结尾 5 变量标识符严格区分大小写 6 标识符的命名规则参照JAVA 7 如果使用了 一个没有声明的变量,那么运行时会报uncaught ReferenceError: *** is not de

【vue3|第28期】 Vue3 + Vue Router:探索路由重定向的使用与作用

日期:2024年9月8日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉在这里插入代码片得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083;0.98365 = 0.0006 说

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满

多云架构下大模型训练的存储稳定性探索

一、多云架构与大模型训练的融合 (一)多云架构的优势与挑战 多云架构为大模型训练带来了诸多优势。首先,资源灵活性显著提高,不同的云平台可以提供不同类型的计算资源和存储服务,满足大模型训练在不同阶段的需求。例如,某些云平台可能在 GPU 计算资源上具有优势,而另一些则在存储成本或性能上表现出色,企业可以根据实际情况进行选择和组合。其次,扩展性得以增强,当大模型的规模不断扩大时,单一云平

axure之变量

一、设置我们的第一个变量 1、点击axure上方设置一个全局变量a = 3 2、加入按钮、文本框元件点击按钮文档框展示变量值。 交互选择【单击时】【设置文本】再点击函数。 点击插入变量和函数直接选择刚刚定义的全局变量,也可以直接手动写入函数(注意写入格式。) 这样点击按钮时就直接展示刚刚设置的全局变量3了。 2、更改变量值 在新建交互里点击设置变量值。 将a变量设置成等于10. 将新