首頁 後端開發 php教程 PHP变量在zend内核中的储存方式

PHP变量在zend内核中的储存方式

Jun 13, 2016 pm 12:23 PM
define zend zval

PHP变量在zend内核中的存储方式

PHP中的变量可以保存任何的数据类型,这是因为它是弱类型语言。但php是用C语言编写的,C语言是强类型语言,每个变量都有固定的类型,不能随意改变变量的类型(可以通过强制类型转变,不过有可能出现问题),在zend引擎中是怎样可以做到一个变量保存任何类型的呢?
在zend/zend.h头文件中,会发现下面的结构体:

<code>typedef struct _zval_struct zval;typedef union _zvalue_value {    long lval;    double dval;    struct {        char *val;        int len;    }str;    HashTable *ht;    zend_object_value obj;} zvalue_value ;struct _zval_struct {    zvalue_value value;    zend_uint refcount;    zend_uchar type;    zend_uchar is_ref;};</code>
登入後複製

zval结构体就是通常用到的PHP变量在内核中的表达方式。在zval结构体中,可以看到4个成员变量,分别是:

<code>zvalue_value value;  //变量的值,PHP变量的值就保存在这里zend_uint refcount;  //变量引用数,变量引用计算器zend_uchar type;     //变量的类型zend_uchar is_ref;   //变量是否被引用</code>
登入後複製

zval结构体的value成员变量是一个zvalue_value联合体,PHP能够保持任何的结构类型就是因为这个联合体 。从zvalue_value联合体的成员变量中可以看到,不同类型会保存到不同的成员变量中,这样就实现了PHP变量可以存储任何数据类型。例如,当变量是整数类型时,会保存到value的lval成员变量中;当变量的类型是字符串时,又会保存到value的str成员变量中。

不同类型对应的成员变量
还有一个问题,就是zend引擎是怎么知道这个变量保存的是什么类型呢?我们注意到,zval结构体中有个type成员变量,这个成员变量就是要保存一个php变量的类型。
zend引擎定义了8中变量类型:

<code>#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</code>
登入後複製

每一个宏定义对应php语言层的一种类型,例如当zval的type成员变量等于IS_STRING时(zval.type==IS_STRING),说明这个变量的类型是字符串类型。

版权声明:本文为博主原创文章,未经博主允许不得转载。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

define怎麼定義多行宏 define怎麼定義多行宏 Oct 11, 2023 pm 01:24 PM

define定義多行巨集可以透過使用 `\` 將 `do { \ printf("%d\n", x); \ } while (0)` 分成了多行來定義。在巨集定義中,反斜線 `\` 必須是巨集定義的最後一個字符,且不能有空格或註解跟隨。使用 `\` 進行續行時,請注意保持程式碼的可讀性,並確保每個行末都有 `\`。

探究PHP中define函數的重要性與作用 探究PHP中define函數的重要性與作用 Mar 19, 2024 pm 12:12 PM

PHP中define函數的重要性與作用1.define函數的基本介紹在PHP中,define函數是用來定義常數的關鍵函數,常量在程式運行過程中不會改變其值。利用define函數定義的常數,在整個腳本中均可被訪問,具有全域性。 2.define函數的語法define函數的基本語法如下:define(&quot;常數名稱&quot;,&quot;常數值&amp;qu

PHP實作框架:Zend Framework入門教程 PHP實作框架:Zend Framework入門教程 Jun 19, 2023 am 08:09 AM

PHP實作框架:ZendFramework入門教學ZendFramework是PHP開發的開源網站框架,目前由ZendTechnologies維護,ZendFramework採用了MVC設計模式,提供了一系列可重複使用的程式碼庫,服務於實作Web2.0應用程式和Web服務。 ZendFramework深受PHP開發者的歡迎與推崇,擁有廣泛

如何在Zend框架中使用ACL(Access Control List)進行權限控制 如何在Zend框架中使用ACL(Access Control List)進行權限控制 Jul 29, 2023 am 09:24 AM

如何在Zend框架中使用ACL(AccessControlList)進行權限控制導言:在一個Web應用程式中,權限控制是至關重要的功能。它可以確保使用者只能存取其有權存取的頁面和功能,並防止未經授權的存取。 Zend框架提供了一種方便的方法來實現權限控制,即使用ACL(AccessControlList)元件。本文將介紹如何在Zend框架中使用ACL

PHP是如何儲存變數的? zval結構體你了解嗎? PHP是如何儲存變數的? zval結構體你了解嗎? May 26, 2022 am 09:47 AM

在 PHP 中定義一個變數是不需要宣告類型的,一開始給變數 $a 一個整數值,後面又可以輕易地將其改變為其他類型。那在 PHP 的源碼中是如何來儲存這個變數 $a 的呢?帶著這個疑問我們一起去看 PHP 的原始碼。

define怎麼定義條件編譯 define怎麼定義條件編譯 Oct 11, 2023 pm 01:20 PM

define定義條件編譯可以使用 `#ifdef`、`#ifndef`、`#if`、`#elif`、`#else` 和 `#endif` 預處理指令來實作。

define定義函數巨集的用法 define定義函數巨集的用法 Oct 11, 2023 pm 12:00 PM

define定義函數宏的用法:1、定義簡單的計算宏,「#define SQUARE(x) ((x) * (x))」;2、定義具有多個參數的宏,「#define MAX(a , b) ((a) > (b) ? (a) : (b))」;3、定義有複雜表達式的宏,"#define ABS(x) ((x) < 0 ? -(x ) : (x))」。

typedef和define區別 typedef和define區別 Sep 26, 2023 am 10:41 AM

typedef和define區別在類型檢查、作用範圍、可讀性、錯誤處理和記憶體佔用等。詳細介紹:1、類型檢查,typedef定義的類型別名是真正的類型,會進行類型檢查,而define定義的巨集只是簡單的文字替換,不會進行類型檢查;2、作用範圍,typedef定義的類型別名的作用範圍是局部的,只在目前的作用域內有效,而define定義的巨集是全域的,可以在任何地方使用;3、可讀性等等。

See all articles