Maison développement back-end tutoriel 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>
Copier après la connexion

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

<code>zvalue_value value;  //变量的值,PHP变量的值就保存在这里zend_uint refcount;  //变量引用数,变量引用计算器zend_uchar type;     //变量的类型zend_uchar is_ref;   //变量是否被引用</code>
Copier après la connexion

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>
Copier après la connexion

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

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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
4 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

définirComment définir des macros multilignes définirComment définir des macros multilignes Oct 11, 2023 pm 01:24 PM

définir définit une macro multiligne en utilisant `\` pour diviser `do { \ printf("%d\n", x \ } while (0)` en plusieurs lignes pour la définition. Dans une définition de macro, la barre oblique inverse `\` doit être le dernier caractère de la définition de macro et ne peut pas être suivie d'espaces ou de commentaires. Lorsque vous utilisez `\` pour la continuation de ligne, veillez à garder le code lisible et assurez-vous qu'il y a un `\` à la fin de chaque ligne.

Explorez l'importance et le rôle de la fonction de définition en PHP Explorez l'importance et le rôle de la fonction de définition en PHP Mar 19, 2024 pm 12:12 PM

L'importance et le rôle de la fonction de définition en PHP 1. Introduction de base à la fonction de définition En PHP, la fonction de définition est une fonction clé utilisée pour définir des constantes. Les constantes ne changeront pas leurs valeurs pendant l'exécution du programme. Les constantes définies à l'aide de la fonction de définition sont accessibles tout au long du script et sont globales. 2. La syntaxe de la fonction de définition La syntaxe de base de la fonction de définition est la suivante : définir("nom constant","valeur constante&qu

Comment utiliser l'ACL (Access Control List) pour le contrôle des autorisations dans Zend Framework Comment utiliser l'ACL (Access Control List) pour le contrôle des autorisations dans Zend Framework Jul 29, 2023 am 09:24 AM

Comment utiliser l'ACL (AccessControlList) pour le contrôle des autorisations dans Zend Framework Introduction : Dans une application Web, le contrôle des autorisations est une fonction cruciale. Il garantit que les utilisateurs ne peuvent accéder qu'aux pages et fonctionnalités auxquelles ils sont autorisés à accéder et empêche tout accès non autorisé. Le framework Zend fournit un moyen pratique d'implémenter le contrôle des autorisations, en utilisant le composant ACL (AccessControlList). Cet article explique comment utiliser l'ACL dans Zend Framework.

DefineComment définir la compilation conditionnelle DefineComment définir la compilation conditionnelle Oct 11, 2023 pm 01:20 PM

La compilation DefineConditional peut être réalisée en utilisant les directives de prétraitement `#ifdef`, `#ifndef`, `#if`, `#elif`, `#else` et `#endif`.

définir l'utilisation de la macro de fonction définir l'utilisation de la macro de fonction Oct 11, 2023 pm 12:00 PM

Utilisation de la macro de fonction de définition : 1. Définissez une macro de calcul simple, "#define SQUARE(x) ((x) * (x))" 2. Définissez une macro avec plusieurs paramètres, "#define MAX(a , b) ; ) ((a) > (b) ? (a) : (b))"; 3. Définir des macros avec des expressions complexes, "#define ABS(x) ((x) < 0 ? -(x ) : (x) ) ».

Framework d'implémentation PHP : Tutoriel de mise en route de Zend Framework Framework d'implémentation PHP : Tutoriel de mise en route de Zend Framework Jun 19, 2023 am 08:09 AM

Framework d'implémentation PHP : tutoriel d'introduction à ZendFramework ZendFramework est un framework de site Web open source développé par PHP et actuellement maintenu par ZendTechnologies. ZendFramework adopte le modèle de conception MVC et fournit une série de bibliothèques de code réutilisables pour servir l'implémentation d'applications Web2.0 et Web Serve. ZendFramework est très populaire et respecté par les développeurs PHP et propose une large gamme de

Comment PHP stocke-t-il les variables ? Comprenez-vous la structure de zval ? Comment PHP stocke-t-il les variables ? Comprenez-vous la structure de zval ? May 26, 2022 am 09:47 AM

Il n'est pas nécessaire de déclarer un type lors de la définition d'une variable en PHP. Vous attribuez initialement une valeur entière à la variable $a, et vous pouvez facilement la modifier ultérieurement. Alors, comment cette variable $a est-elle stockée dans le code source PHP ? En gardant cette question à l’esprit, jetons un coup d’œil au code source de PHP.

La différence entre typedef et définir La différence entre typedef et définir Sep 26, 2023 am 10:41 AM

La différence entre typedef et definition réside dans la vérification du type, la portée, la lisibilité, la gestion des erreurs, l'utilisation de la mémoire, etc. Introduction détaillée : 1. Vérification de type, l'alias de type défini par typedef est un type réel, et la vérification de type sera effectuée, tandis que la macro définie par définir n'est qu'un simple remplacement de texte, et la vérification de type ne sera pas effectuée 2. Portée ; , l'alias de type défini par typedef. La portée de est locale et valide uniquement dans la portée actuelle, tandis que la macro définie par définir est globale et peut être utilisée n'importe où. 3. Lisibilité, etc.

See all articles