Remarque : Il s'agit d'une question de référence traitant de la portée des variables en PHP. Veuillez fermer l'une des nombreuses questions qui correspondent à ce modèle en tant que doublon de cette question.
Qu'est-ce que la « portée variable » en PHP ? Les variables d'un fichier .php sont-elles accessibles dans un autre fichier .php ? Pourquoi est-ce que j'obtiens parfois des erreurs "variable non définie" ?
Bien que les variables définies dans la portée d'une fonction ne soient pas accessibles de l'extérieur, cela ne signifie pas que vous ne pouvez pas utiliser leurs valeurs une fois la fonction terminée. PHP possède un
static
关键字,在面向对象的 PHP 中广泛用于定义静态方法和属性,但应该记住static
bien connu qui peut également être utilisé pour définir des variables statiques à l'intérieur de fonctions.Qu'est-ce qu'une « variable statique » ?
Les variables statiques sont différentes des variables ordinaires définies dans la portée de la fonction. Les variables statiques ne perdront pas leur valeur lorsque l'exécution du programme quitte la portée. Considérons l'exemple suivant utilisant des variables statiques :
Résultat :
Si nous définissons
$counter
没有static
那么每次回显的值将与传递给函数的$num
参数相同。使用static
, nous pouvons construire ce compteur simple sans solutions de contournement supplémentaires.Cas d'utilisation des variables statiques
Conseils
Les variables statiques n'existent que dans la portée de la fonction locale. ça ne peut pas être Accessible en dehors de la fonction dans laquelle il est défini. afin que vous puissiez Assurez-vous qu'il conservera sa valeur jusqu'au prochain appel Cette fonction.
Les variables statiques ne peuvent être définies que comme scalaires ou scalaires Expressions (depuis PHP 5.6). lui attribuer forcément d'autres valeurs Ce qui aboutit à un échec, du moins au moment d’écrire ces lignes. Cependant, vous pouvez le faire sur la ligne de code suivante :
Résultat :
Les fonctions statiques sont quelque peu "partagées" entre les méthodes de l'objet Camarades de classe. C’est facile à comprendre en regardant l’exemple ci-dessous :
Cela ne fonctionne que pour les objets de la même classe. Les variables statiques se comporteront comme prévu si les objets appartiennent à des classes différentes (ou même s'étendent les uns les autres).
Les variables statiques sont-elles le seul moyen de conserver les valeurs entre les appels de fonction ?
Une autre façon de préserver les valeurs entre les appels de fonction consiste à utiliser des fermetures. Les fermetures ont été introduites dans PHP 5.3. En bref, ils vous permettent de restreindre l'accès à un certain ensemble de variables dans le cadre d'une fonction à une autre fonction anonyme, qui sera le seul moyen d'y accéder. Être à l'intérieur d'une variable de fermeture peut émuler (plus ou moins avec succès) des concepts POO tels que les "constantes de classe" (si elles sont transmises par valeur dans la fermeture) ou les "propriétés privées" (si transmises par référence) dans la programmation structurée.
Ce dernier permet en fait d'utiliser des fermetures au lieu de variables statiques. C'est toujours au développeur de décider quoi utiliser, mais il convient de mentionner que les variables statiques sont certainement utiles lors de l'utilisation de la récursivité et méritent l'attention du développeur.
Qu'est-ce que la « portée variable » ?
Les variables sont limitées dans leur « portée » ou « où elles sont accessibles ». Ce n'est pas parce que vous avez écrit
. La variable$foo = 'bar';
une fois quelque part dans votre application que vous pouvez référencer$foo
depuis$foo = 'bar';
一次,并不意味着您可以从引用$foo
>应用程序内的其他地方。变量$foo
>Ailleurs dans l'application$foo
a une certaine portée dans laquelle elle est valide, et seul le code dans la même portée peut accéder à la variable.C'est très simple : PHP a des étendues de fonctions. C'est le seul délimiteur de plage présent en PHP. Les variables à l'intérieur d'une fonction ne sont disponibles qu'à l'intérieur de cette fonction. Les variables en dehors d'une fonction peuvent être utilisées n'importe où en dehors de la fonction, mais ne peuvent pas être utilisées dans une fonction. Cela signifie qu'il existe une portée spéciale en PHP : la portée globale
. Toute variable déclarée en dehors de toute fonction se trouve dans cette portée globale.$foo
位于 global 范围内,$baz
位于内的local 范围内myFunc。只有
myFunc
中的代码才能访问$baz
。只有myFunc
外部的代码可以访问$foo
$foo
est dans la portée globalet
local$baz
est dans la portéede myFunc dans
. Seul le code dans
myFunc
peut accéder à$baz
. Seul le code en dehors demyFunc
peut accéder à$foo
. Aucune des parties ne peut accéder à l'autre :Portée et fichiers inclus Les limites des fichiers
ne se séparent pasPlage :
a.phpinclude
代码的规则与适用于任何其他代码的规则相同:仅函数
b.php
S'applique à une portée distincte pour. À des fins de portée, vous pouvez envisager d'inclure des fichiers tels que copier et coller du code :
a.php
包含在myFunc
中,a.php
中的任何变量仅具有本地函数作用域。仅仅因为它们似乎位于a.php
c.php
function
Dans l'exemple ci-dessus,a.php
est contenu dansmyFunc
, et toutes les variables dea.php
n'ont qu'une portée de fonction locale. Ce n'est pas parce qu'ils semblentavoir une portée globale dans
a.php
qu'ils le sont, cela dépend vraiment du contexte dans lequel le code est contenu/exécuté.Qu'en est-il des fonctions et fonctions au sein des classes ?
Chaque nouvelle
déclaration introduit un nouveau champ d'application, c'est aussi simple que cela.Fonction au sein d'une fonction (anonyme)
$name
CoursÀ quoi sert la portée ?
🎜Gérer les problèmes de portée peut sembler ennuyeux, mais 🎜la portée limitée des variables est cruciale pour écrire des applications complexes ! 🎜 Si chaque variable que vous déclarez est disponible n'importe où ailleurs dans votre application, vous effectuerez toutes les opérations sur vos variables sans aucun moyen réel de suivre ce qui a changé quoi. Vous êtes limité dans les noms sensés que vous pouvez donner à vos variables, et vous souhaiterez peut-être utiliser la variable "🎜" à plusieurs endroits. Si vous ne pouvez utiliser ce nom de variable unique qu'une seule fois dans votre application, vous devez utiliser un schéma de dénomination très complexe pour garantir que vos variables sont uniques et que vous ne modifiez pas la mauvaise variable à partir du mauvais morceau de code. 🎜 🎜Observations : 🎜Que fait la fonction ci-dessus s'il n'y a pas de portée ?
$bar
D'où vient-il ? Quel statut a-t-il ? Est-il même initialisé ? Dois-je le vérifier à chaque fois ? Ce n'est pas maintenable. Ce qui nous amène à...Franchir les limites de la gamme
La bonne façon : transmettre des variables d'entrée et de sortie
Variables
$bar
entrent explicitement cette portée en tant que paramètres de fonction. Rien qu'en regardant cette fonction, il est clair d'où viennent les valeurs qu'elle utilise. Ensuite, il renvoie explicitement une valeur. L'appelant sait en toute confiance quelles variables la fonction utilisera et d'où proviendra sa valeur de retour :Étendre la portée des variables aux fonctions anonymes
Les fonctions anonymes incluent explicitement
$foo
dans leur portée environnante. Notez que ce n'est pas la même chose que le périmètre mondial.Mauvais chemin :
全局
Comme mentionné précédemment, la portée globale est quelque peu spéciale et les fonctions peuvent explicitement en importer des variables :
Cette fonction utilise et modifie les variables globales
$foo
. Ne fais pas ça ! (À moins que tu saches vraiment vraiment ce que tu fais, et encore : ne le fais pas !)Ce que voit l'appelant de cette fonction est ceci :
Rien n’indique que cette fonction ait des effets secondaires, mais c’est le cas. Cela peut facilement prêter à confusion car certaines fonctions se modifient constamment et nécessitent un état global. Vous voulez que les fonctions soient sans état, agissant uniquement sur leurs entrées et renvoyant des sorties définies, peu importe le nombre de fois que vous les appelez.
Vous devez éviter d'utiliser la portée globale de quelque manière que ce soit si possible ; très certainement, vous ne devez pas "extraire" les variables de la portée globale vers la portée locale.