PHP ZVAL是什么意思?_后端开发

PHP ZVAL是什么意思?_后端开发,第1张

php echo、print、print_r、var_dum的区别有哪些_后端开发

php echo、print、print_r、var_dum的区别有:1、echo和print是语言结构,而print_r和var_dump是普通函数;2、echo用于输出一个或多个字符串;3、print用于输出字符串等等。


PHP ZVAL是PHP中最重要的数据结构之一,包含了PHP中的变量值和类型的相关信息,它是struct结构,基本结构为【struct _zval_struct(zvalue_value value zend_uchar type)】。


PHP ZVAL是什么意思?_后端开发,第2张

PHP ZVAL的意思是:

ZVAL的基本结构

Zval是PHP中最重要的数据结构之一(另一个比较重要的数据结构是hash table),它包含了PHP中的变量值和类型的相关信息。


它是一个struct,基本结构为:

struct _zval_struct {
    zvalue_value value;     /* 存储变量的值*/
    zend_uint refcount__gc;  /* 表示引用计数 */
    zend_uchar type;          /* 变量具体的类型 */
    zend_uchar is_ref__gc;    /* 表示是否为引用 */
};
typedef struct _zval_struct zval;

其中:

1、zval_value value

变量的实际值,具体来说是一个zvalue_value的联合体(union):

typedef union _zvalue_value {
    long lval;                  /* long value */
    double dval;                /* double value */
    struct {                    /* string */
        char *val;
        int len;
    } str;
    HashTable *ht;              /* hash table value,used for array */
    zend_object_value obj;      /* object */
} zvalue_value;

2、zend_uint refcount__gc

该值实际上是一个计数器,用来保存有多少变量(或者符号,symbols, 所有的符号都存在符号表(symble table)中, 不同的作用域使用不同的符号表,关于这一点,我们之后会论述)指向该zval。


php模板引擎原理是什么?_后端开发

php模板引擎原理是作为视图层和模型层分离的一种有效解决方案,让前后端更好的分工协作,来自于经典的MVC模型,即【模型层-视图层-控制器模型】,将M和V实现代码分离,从而使同一个程序可以使用不同的表现形式。


在变量生成时,其refcount=1,典型的赋值 *** 作如a=b会令zval的refcount加1,而unset *** 作会相应的减1。


在PHP5.3之前,使用引用计数的机制来实现GC,如果一个zval的 refcount较少到0,那么Zend引擎会认为没有任何变量指向该zval,因此会释放该zval所占的内存空间。


但,事情有时并不会那么简单。


后面 我们会看到,单纯的引用计数机制无法GC掉循环引用的zval,即使指向该zval的变量已经被unset,从而导致了内存泄露(Memory Leak)。


3、zend_uchar type

该字段用于表明变量的实际类型。


在开始学习PHP的时候,我们已经知道,PHP中的变量包括四种标量类(bool,int,float,string),两种复合类型(array, object)和两种特殊的类型(resource 和NULL)。


在zend内部,这些类型对应于下面的宏(代码位置 phpsrc/Zend/zend.h):

#define IS_NULL     0
#define IS_LONG     1
#define IS_DOUBLE   2
#define IS_BOOL     3
#define IS_ARRAY    4
#define IS_OBJECT   5
#define IS_STRING   6
#define IS_RESOURCE 7
#define IS_CONSTANT 8
#define IS_CONSTANT_ARRAY   9
#define IS_CALLABLE 10

4、is_ref__gc

这个字段用于标记变量是否是引用变量。


对于普通的变量,该值为0,而对于引用型的变量,该值为1。


这个变量会影响zval的共享、分离等。


关于这点,我们之后会有论述。


正如名字所示,ref_count__gcis_ref__gc是PHP的GC机制所需的很重要的两个字段,这两个字段的值,可以通过xdebug等调试工具查看。


相关学习推荐:PHP编程从入门到精通

以上就是PHP ZVAL是什么意思?的详细内容,更多请关注ki4网其它相关文章!

php超全局变量的作用是什么_后端开发

php超全局变量的作用就是使许多预定义变量在一个脚本的全部作用域中都可用,并且在函数或方法中无需执行“global $variable;”就可以访问它们。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/561325.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020-07-02
下一篇 2020-07-02

发表评论

登录后才能评论

评论列表(0条)

保存