Méthodes pour implémenter des variables de type faible en PHP : 1. Utilisez C pour implémenter des types faibles via le moteur Zend et utilisez la structure zval pour les enregistrer dans ZE 2. Utilisez le moteur Zend pour identifier et stocker divers ; données dans PHP Type, sélectionnez pour obtenir la valeur de [zvalue_value] en fonction du type.
Comment implémenter des variables faiblement typées en PHP :
PHP est un script de langage dynamique, faiblement typé. Lors de la déclaration d'une variable, vous n'avez pas besoin de spécifier le type de données qu'elle contient. Par exemple :
<?php $var = 1; $var = "variable"; $var = 1.00; $var = array(); $var = new Object();
Les variables dynamiques peuvent être modifiées pendant l'exécution, et il n'est pas nécessaire de déclarer le type de variable avant utilisation.
Recommandations d'apprentissage associées : Programmation PHP de l'entrée à la maîtrise
Question 1. Comment le moteur Zend utilise-t-il C pour implémenter cela faible Et le type ?
En fait, les variables déclarées en PHP sont stockées dans ZE en utilisant la structure zval.
Nous ouvrons d'abord Zend/zend.h
pour voir la définition de zval :
typedef struct _zval_struct zval; struct _zval_struct { /* Variable information */ zvalue_value value; /* value */ zend_uint refcount__gc; zend_uchar type; /* active type */ zend_uchar is_ref__gc; }; typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht; /* hash table value */ zend_object_value obj; } zvalue_value;
Zend/zend_types.h:
typedef unsigned char zend_bool; typedef unsigned char zend_uchar; typedef unsigned int zend_uint; typedef unsigned long zend_ulong; typedef unsigned short zend_ushort;
À partir du code ci-dessus, vous pouvez voir que _zvalue_value
enregistre réellement la partie clé des données. Déclaration de variables faiblement typées implémentée via les unions
Question 2 : Comment le moteur Zend identifie-t-il et stocke-t-il plusieurs types de données en PHP ?
_zval_struct.type
stocke le type réel d'une variable En fonction du type, vous pouvez choisir comment obtenir la valeur de zvalue_value.
liste de valeurs de type (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
Regardons un exemple simple :
<?php $a = 1; //此时zval.type = IS_LONG,那么zval.value就去取lval. $a = array(); //此时zval.type = IS_ARRAY,那么zval.value就去取ht.
Le plus compliqué, Et ce qui est souvent nécessaire dans le développement d'extensions tierces est le "type de ressource".
En PHP, toute variable qui n'appartient pas au type de variable intégré de PHP sera considérée comme une ressource et enregistrée.
Par exemple : handle de base de données, handle de fichier ouvert, handle de socket ouvert.
Pour le type de ressource, lval sera utilisé à ce stade, il s'agit d'un indicateur entier. Ensuite, PHP interrogera la liste de ressources correspondante dans la liste de ressources intégrée de PHP en fonction de cet indicateur. .ressource.
C'est précisément à cause de la méthode de traitement de ZE que PHP implémente des types faibles, et pour ZE, il fait toujours face au même type zval.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!