Table des matières
Structure de base des variables
Implémentation de zval
Comparaison de la structure zval de PHP5 et PHP7
Types de variables courants
Types entiers et virgule flottante
String
Maison développement back-end PHP7 Maîtriser les variables de base de PHP7

Maîtriser les variables de base de PHP7

Nov 17, 2020 pm 04:40 PM
php7

La colonne

PHP7 présente les variables de base associées.

Maîtriser les variables de base de PHP7

Structure de base des variables

Nous savons tous que les variables PHP sont faiblement typées, et il n'est pas nécessaire de spécifier le type lors de leur déclaration. Alors, comment cela est-il mis en œuvre ? Cela doit commencer par la structure de base des variables.

Implémentation de zval

Dans le fichier de code source zend_type.h, vous pouvez voir la définition de zval :

typedef struct _zval_struct     zval;struct _zval_struct {
	zend_value        value;			/* value */
	union {		struct {
			ZEND_ENDIAN_LOHI_4(
				zend_uchar    type,			/* active type */
				zend_uchar    type_flags,
				zend_uchar    const_flags,
				zend_uchar    reserved)	    /* call info for EX(This) */
		} v;		uint32_t type_info;
	} u1;	union {		uint32_t     next;                 /* hash collision chain */
		uint32_t     cache_slot;           /* literal cache slot */
		uint32_t     lineno;               /* line number (for ast nodes) */
		uint32_t     num_args;             /* arguments number for EX(This) */
		uint32_t     fe_pos;               /* foreach position */
		uint32_t     fe_iter_idx;          /* foreach iterator index */
		uint32_t     access_flags;         /* class constant access flags */
		uint32_t     property_guard;       /* single property guard */
		uint32_t     extra;                /* not further specified */
	} u2;
}复制代码
Copier après la connexion

La structure de zval est constituée d'une valeur ou d'un pointeur qui contient le type de variable L'union zend_value et les deux unions u1 et u2 forment

  • u1

u1 est utilisé pour enregistrer le type de variable et ses informations, ainsi que les champs à l'intérieur it Les utilisations sont les suivantes :

type : type de variable d'enregistrement. Vous pouvez accéder à

type_flags via u2.v.type: balises correspondant aux types uniques de variables (tels que les types constants, les types de comptage de références, les types immuables correspondent à différents indicateurs).

const_flags : drapeaux de type constant

reserved : champs réservés

  • u2

u2 est principalement une fonction auxiliaire, en raison de la structure La mémoire est alignée, donc l'espace de u2 a déjà occupé de l'espace avec ou sans u2, donc il est utilisé. Le champ auxiliaire de u2 enregistre de nombreuses informations de type, ce qui est très bénéfique pour les fonctions internes, ou améliore la convivialité du cache ou réduit les opérations d'adressage mémoire. Certains de ces domaines sont présentés ici.

next : utilisé pour résoudre le problème du conflit de hachage (le conflit de hachage n'est pas encore compris) et enregistrer la position de l'élément suivant du conflit.

cache_slot : cache d'exécution. Lors de l'exécution d'une fonction, elle recherchera d'abord dans le cache. Si elle n'est pas trouvée dans le cache, elle recherchera ensuite dans la table des fonctions globales.

num_args : le nombre de paramètres transmis lorsque la fonction est appelée.

access_flags : l'indicateur d'accès de la classe d'objet, telle que public protected private.

  • zend_value
typedef union _zend_value {
	zend_long         lval;				/* 整型*/
	double            dval;				/* 浮点型 */
	zend_refcounted  *counted;
	zend_string      *str;
	zend_array       *arr;
	zend_object      *obj;
	zend_resource    *res;
	zend_reference   *ref;
	zend_ast_ref     *ast;
	zval             *zv;	void             *ptr;
	zend_class_entry *ce;
	zend_function    *func;	struct {
		uint32_t w1;		uint32_t w2;
	} ww;
} zend_value;复制代码
Copier après la connexion

Comme le montre zend__value, les types longs et doubles stockent directement les valeurs, tandis que les autres types sont des pointeurs, pointant vers leurs structures respectives. Par conséquent, en raison de structures comme zval, les variables PHP n'ont pas besoin de spécifier explicitement leurs types lors de leur déclaration, car quel que soit le type de valeur que vous attribuez à la variable, cela peut vous aider à trouver la structure de stockage correspondante.

En prenant comme exemple une variable dont la valeur est une chaîne, sa structure est la suivante :

Maîtriser les variables de base de PHP7

Comparaison de la structure zval de PHP5 et PHP7

  • PHP5
Maîtriser les variables de base de PHP7
  • PHP7
Maîtriser les variables de base de PHP7

Vous pouvez constater que le zval de php7 n'occupe que 16 octets au total, ce qui permet d'économiser beaucoup de mémoire par rapport aux 48 octets de zval de PHP5.

De plus, en PHP5, toutes les variables sont allouées dans le tas, mais pour les variables temporaires, il n'est pas nécessaire d'allouer dans le tas. Par conséquent, cela a été optimisé en PHP7 et les variables temporaires sont appliquées directement sur la pile.

Types de variables courants

Ce qui suit présente plusieurs types courants de structures de variables. Pour d'autres types, vous pouvez vérifier vous-même le code source.

Types entiers et virgule flottante

Pour les types entiers et virgule flottante, en raison de leur petit espace, les valeurs entières​​sont directement stockées dans zval et sont stockées dans le type lval. la valeur est stockée dans dval.

typedef union _zend_value {
    zend_long         lval;             /* 整型*/
    double            dval;             /* 浮点型 */
    ... 
 }复制代码
Copier après la connexion

String

Une nouvelle structure de chaîne est définie dans PHP 7. La structure est la suivante :

struct _zend_string {
	zend_refcounted_h ;
	zend_ulong        h;                /* hash value */
	size_t            len;	char              val[1];
};复制代码
Copier après la connexion

La signification de chaque champ ci-dessus :

gc : Informations de référence variable, tous les types de variables qui utilisent le comptage de références auront cette structure.

h : valeur de hachage, utilisée lors du calcul de l'index dans un tableau. (On dit que cette opération améliore les performances de PHP7 de 5%)

len : Longueur de chaîne, la sécurité binaire est assurée grâce à cette valeur

val : Contenu de chaîne, structure de longueur variable, appuyez sur lorsque la longueur de lentille allouée s'applique à la mémoire Array

array est une structure de données très puissante en PHP. Son implémentation sous-jacente est une HashTable ordonnée ordinaire. Voici un bref aperçu de sa structure. Plus de détails seront donnés plus tard.

typedef struct _zend_array HashTable;struct _zend_array {
	zend_refcounted_h gc;	union {		struct {
			ZEND_ENDIAN_LOHI_4(
				zend_uchar    flags,
				zend_uchar    nApplyCount,
				zend_uchar    nIteratorsCount,
				zend_uchar    consistency)
		} v;		uint32_t flags;
	} u;	uint32_t          nTableMask;
	Bucket           *arData;	uint32_t          nNumUsed;	uint32_t          nNumOfElements;	uint32_t          nTableSize;	uint32_t          nInternalPointer;
	zend_long         nNextFreeElement;	dtor_func_t       pDestructor;
}复制代码
Copier après la connexion

###Object

La structure des objets de PHP7 a également été repensée, ce qui est très différent de l'implémentation de PHP5.

struct _zend_object {
    zend_refcounted_h gc;    uint32_t          handle;
    zend_class_entry *ce; 
    const zend_object_handlers *handlers;
    HashTable        *properties; 
    zval              properties_table[1];
};复制代码
Copier après la connexion

Voici quelques-uns des champs :

gc : en-tête gc

*ce : classe correspondant à la classe d'objet

*propriétés : Structure HashTable , key est le nom de l'attribut de l'objet, value est le décalage de la valeur de l'attribut dans le tableau Properties_tables et la valeur de l'attribut correspondante se trouve dans Properties_talbe via le décalage.

properties_talbe[1] : stocke la valeur d'attribut de l'objet

Recommandation gratuite : PHP7

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!

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
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 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)

Comment résoudre le problème lorsque php7 détecte que le port TCP ne fonctionne pas Comment résoudre le problème lorsque php7 détecte que le port TCP ne fonctionne pas Mar 22, 2023 am 09:30 AM

En php5, nous pouvons utiliser la fonction fsockopen() pour détecter le port TCP. Cette fonction peut être utilisée pour ouvrir une connexion réseau et effectuer certaines communications réseau. Mais en php7, la fonction fsockopen() peut rencontrer certains problèmes, comme ne pas pouvoir ouvrir le port, ne pas pouvoir se connecter au serveur, etc. Afin de résoudre ce problème, nous pouvons utiliser la fonction socket_create() et la fonction socket_connect() pour détecter le port TCP.

Comment installer l'extension mongo dans php7.0 Comment installer l'extension mongo dans php7.0 Nov 21, 2022 am 10:25 AM

Comment installer l'extension mongo dans php7.0 : 1. Créez le groupe d'utilisateurs et l'utilisateur mongodb ; 2. Téléchargez le package de code source mongodb et placez le package de code source dans le répertoire "/usr/local/src/" ; Entrez le répertoire « src/ » ; 4. Décompressez le package de code source ; 5. Créez le répertoire de fichiers mongodb ; 6. Copiez les fichiers dans le répertoire « mongodb/ » 7. Créez le fichier de configuration mongodb et modifiez la configuration.

Que dois-je faire si le plug-in est installé dans php7.0 mais qu'il indique toujours qu'il n'est pas installé ? Que dois-je faire si le plug-in est installé dans php7.0 mais qu'il indique toujours qu'il n'est pas installé ? Apr 02, 2024 pm 07:39 PM

Pour résoudre le problème du plugin n'affichant pas installé dans PHP 7.0 : Vérifiez la configuration du plugin et activez le plugin. Redémarrez PHP pour appliquer les modifications de configuration. Vérifiez les autorisations du fichier du plugin pour vous assurer qu'elles sont correctes. Installez les dépendances manquantes pour garantir le bon fonctionnement du plugin. Si toutes les autres étapes échouent, reconstruisez PHP. D'autres causes possibles incluent des versions de plugin incompatibles, le chargement d'une mauvaise version ou des problèmes de configuration PHP.

Lequel est le meilleur, php8 ou php7 ? Lequel est le meilleur, php8 ou php7 ? Nov 16, 2023 pm 03:09 PM

Par rapport à PHP7, PHP8 présente certains avantages et améliorations en termes de performances, de nouvelles fonctionnalités et améliorations de la syntaxe, du système de types, de la gestion des erreurs et des extensions. Cependant, le choix de la version à utiliser dépend de vos besoins spécifiques et des circonstances du projet. Introduction détaillée : 1. Amélioration des performances, PHP8 introduit le compilateur Just-in-Time (JIT), qui peut améliorer la vitesse d'exécution du code ; 2. Nouvelles fonctionnalités et améliorations de la syntaxe, PHP8 prend en charge la déclaration des paramètres nommés et des paramètres facultatifs, création de fonctions L'appel est plus flexible ; des classes anonymes, des déclarations de propriétés de type, etc. sont introduites.

Guide FAQ de l'environnement serveur PHP : résoudre rapidement les problèmes courants Guide FAQ de l'environnement serveur PHP : résoudre rapidement les problèmes courants Apr 09, 2024 pm 01:33 PM

Les solutions courantes pour les environnements de serveur PHP consistent à s'assurer que la version correcte de PHP est installée et que les fichiers pertinents ont été copiés dans le répertoire du module. Désactivez SELinux temporairement ou définitivement. Vérifiez et configurez PHP.ini pour vous assurer que les extensions nécessaires ont été ajoutées et configurées correctement. Démarrez ou redémarrez le service PHP-FPM. Vérifiez les paramètres DNS pour les problèmes de résolution.

Comment installer et déployer php7.0 Comment installer et déployer php7.0 Nov 30, 2022 am 09:56 AM

Comment installer et déployer php7.0 : 1. Accédez au site officiel de PHP pour télécharger la version d'installation correspondant au système local ; 2. Extrayez le fichier zip téléchargé dans le répertoire spécifié 3. Ouvrez la fenêtre de ligne de commande et accédez à ; le répertoire "E:\php7" Exécutez simplement la commande "php -v".

Comment télécharger et installer php7 (partage de tutoriel) Comment télécharger et installer php7 (partage de tutoriel) Mar 23, 2023 pm 02:11 PM

Avec le développement de la technologie Internet, les langages de programmation informatique ont également été continuellement développés et mis à jour. En tant que langage de programmation largement utilisé dans le domaine du développement Web, PHP a connu plusieurs mises à jour de versions au fil des ans, et la dernière version de PHP7 a considérablement amélioré ses performances et sa stabilité. Afin de mieux appliquer le langage de programmation PHP, cet article présentera le didacticiel de téléchargement et d'installation de PHP7 à titre de référence pour les débutants.

Enregistrez une fois et utilisez strace pour diagnostiquer le problème de PHP occupant trop de ressources système. Enregistrez une fois et utilisez strace pour diagnostiquer le problème de PHP occupant trop de ressources système. May 03, 2024 pm 04:31 PM

Environnement local : système redhat6.7. nginx1.12.1, php7.1.0, le code utilise le problème du framework yii2 : le site web local doit utiliser le service elasticsearch. Lorsque PHP utilise elasticsearch construit sur un serveur local, la charge locale est normale. Lorsque j'utilise le service elasticsearch d'AWS, la charge sur le serveur local est souvent trop élevée. Vérifiez les journaux nginx et php et ne trouvez aucune exception. Le nombre de connexions simultanées dans le système n’est pas non plus élevé. À ce moment-là, j'ai pensé à un outil de diagnostic strace que notre patron m'a présenté. Processus de débogage : recherchez un sous-processus php idstrace-

See all articles