Maison  >  Article  >  développement back-end  >  Compréhension approfondie des principes PHP : portée variable (Scope en PHP)

Compréhension approfondie des principes PHP : portée variable (Scope en PHP)

angryTom
angryTomavant
2019-10-15 13:43:222020parcourir

Compréhension approfondie des principes PHP : portée variable (Scope en PHP)

L'article précédent (Variables dans PHP) a présenté la représentation interne des variables PHP, mais le problème est de savoir comment ces représentations internes communiquent avec les scripts utilisateur. À quoi sont associées les variables ? Autrement dit, si j'écris dans le script :

<?php
  $var = "laruence";
  echo $var;
?>

Comment ZE connecte-t-il ma variable var à la structure interne zval ?

Comme mentionné dans la compréhension approfondie des variables dans les principes PHP, PHP utilise en interne zval pour représenter les variables, mais pour le script ci-dessus, nos variables ont des noms, var. Il n'y a pas de champ correspondant dans zval pour refléter le nom de la variable.

Si vous y réfléchissez, il doit y avoir un mécanisme dans PHP pour mapper les noms de variables sur zval. Alors tu es vraiment intelligent, ;)

Apprentissage recommandé : Tutoriel vidéo PHP

En PHP, toutes les variables seront stockées dans un tableau (table de hachage pour être précis), et PHP implémente également des variables via différents tableaux de la portée.

Lorsque vous créez une variable, PHP attribuera un zval à la variable, remplira la valeur de la variable correspondante, puis remplira le nom de la variable et le pointeur vers le zval dans un tableau. Ensuite, lorsque vous obtiendrez cette variable, PHP obtiendra le zval correspondant en recherchant le tableau.

Afficher la structure _zend_executor_globals (cette structure enregistre certaines informations de contexte liées à l'exécution dans l'exécuteur PHP)

struct _zend_executor_globals {
 
     ....
    HashTable *active_symbol_table;/*活动符号表*/
    HashTable symbol_table;     /*全局符号表*/
 
    HashTable included_files;
 
    jmp_buf *bailout;
    int error_reporting;
     .....
}

Parmi eux, table des symboles globales , enregistre les variables dans la portée de niveau supérieur (c'est-à-dire pas dans une fonction ou un objet). Chaque fois qu'une fonction (méthode d'un objet) est appelée, une table de symboles active sera créée pour cette fonction, et toutes les variables définies dans cette fonction seront enregistrées dans cette table de symboles active.

Oui, c'est ainsi que la portée des variables PHP est implémentée ! Par exemple :

<?php
     $var = "I am in the global symbol table";
    function sample($para){
        $var = "I am in the active symbol table";
          echo $var;
      }
    sample($var);
    echo $var;
  ?>

La variable $var en dehors de l'échantillon de fonction sera renseignée dans la table des symboles globale, et elle correspond à un zval. pointeur, qui enregistre une chaîne "Je suis dans la table des symboles globale".

$var dans la fonction, elle sera renseignée dans la table des symboles active appartenant à la fonction sample, de même, la chaîne "Je suis dans la table des symboles actifs" est stocké dans le zval qui lui correspond.

Ce qui est spécial c'est le paramètre $para de la fonction sample. Ce $para est stocké dans la table des symboles actifs de l'échantillon, mais le pointeur zval correspondant vers celui-ci pointera vers un zval qui contient une copie de la variable globale $var (à proprement parler, ce n'est pas une copie, mais une référence).

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer