Peut-être que vous le savez, peut-être que vous ne le savez pas, PHP est un langage de script dynamique, faiblement typé. Le type dit faible signifie que PHP ne vérifie pas strictement le type de la variable (à proprement parler, PHP est un langage moyennement typé, cette partie sera décrite dans un prochain article), lors de la déclaration d'une variable , il n'est pas nécessaire d'indiquer explicitement le type de données qu'il enregistre :
<?php $var = 1; //int $var = "laruence"; //string $var = 1.0002; //float $var = array(); // array $var = new Exception('error'); //object;
Langage dynamique, c'est-à-dire que la structure du langage de PHP peut être modifiée au moment de l'exécution, par exemple, nous avons besoin au moment de l'exécution d'un fichier de définition de fonction qui provoque des modifications dynamiques de la table des fonctions du langage.
Le soi-disant langage de script signifie que PHP ne s'exécute pas de manière indépendante. Pour exécuter PHP, nous avons besoin d'un analyseur PHP :
/usr/bin/php -f example.php
J'ai déjà mentionné dans mon article précédent que PHP est exécuté via Zend. (ZE, Zend Engine), ZE est écrit en C. Tout le monde sait que C est un langage fortement typé, c'est-à-dire que toutes les variables en C ne peuvent stocker qu'un seul type à partir du moment où il est déclaré jusqu'au type de destruction final. de données. Alors, comment PHP implémente-t-il les types faibles basés sur ZE ?
En PHP, toutes les variables sont enregistrées avec une structure -zval. Dans Zend/zend.h nous pouvons voir la définition de zval :
typedef struct _zval_struct { zvalue_value value; zend_uint refcount; zend_uchar type; zend_uchar is_ref; } zval;
où zvalue_value est vrai. Il est maintenant temps de révéler la valeur de zval. clé pour sauvegarder les données.Comment PHP implémente-t-il les types faibles basés sur ZE ? Parce que zvalue_value est une union,
typedef union _zvalue_value { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; } zvalue_value;
Alors, comment cette structure stocke-t-elle plusieurs types en PHP ?
Les types de variables courants en PHP sont :
1. Entier/virgule flottante/entier long/valeur booléenne, etc.
2. Chaîne
3. Tableau/tableau associatif
Objet
5. Ressources
PHP stocke le type réel d'une variable en fonction du champ de type dans zval, puis choisit comment obtenir la valeur de zvalue_value en fonction du type. . Par exemple, pour les entiers et les valeurs booléennes :
zval.type = IS_LONG;//整形 zval.type = IS_BOOL;//布尔值
obtenez simplement zval.value.lval, pour les valeurs booléennes lval∈(0|1); s'il s'agit d'une double précision, ou float Ensuite, il obtiendra le dval de zval.value.
Et si c'est une chaîne, alors :
zval.type = IS_STRING
A ce moment, ce sera :
zval.value.strEt c'est également une structure, stockant la chaîne au format C et la longueur de la chaîne.
Pour les tableaux et les objets, le type correspond respectivement à
IS_ARRAY, IS_OBJECT, et les correspondants sont zval.value.ht et obj Ce qui est spécial, c'est la ressource. En PHP, la ressource est une variable très spéciale. Toute variable qui n'appartient pas au type de variable intégré de PHP sera considérée comme une ressource à sauvegarder, comme un handle de base de données, un handle de fichier ouvert. , etc. . Pour les ressources :
type = IS_RESOURCE
À ce moment,
zval.value.lval sera récupéré. À ce moment, lval est un indicateur entier, puis PHP utilisera cet indicateur dans PHP Query. ressources correspondantes dans une liste de ressources que vous avez créée (je présenterai cette partie dans un article séparé dans le futur, il vous suffit de savoir que le lval à ce moment semble être la valeur de décalage correspondant à la liste de ressources). Pour plus de connaissances sur PHP, veuillez visiter le 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! ZEND_FETCH_RESOURCE(con, type, zval *, default, resource_name, resource_type);