PHP变量在zend内核中的储存方式
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
),说明这个变量的类型是字符串类型。
版权声明:本文为博主原创文章,未经博主允许不得转载。

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds

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.

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 (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.

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

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 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

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 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.
