41 votes

Variables statiques PHP

$count = 5;
function get_count()
{
    static $count = 0;
    return $count++;
}
echo $count;
++$count;
echo get_count();
echo get_count();

J'ai deviné qu'il s'agissait de sorties 5 0 1 et c'est juste, mais j'ai besoin d'une meilleure explication ?

6 votes

Si c'est un travail à domicile, marquez-le comme tel.

23 votes

Je ne pense pas que ce soit un devoir, certaines personnes n'ont juste jamais utilisé de variables statiques en PHP (surtout si elles sont habituées à la programmation procédurale directe).

6 votes

Que fait le ++$count ; là-dedans ?

73voto

soulmerge Points 37314

La variable $count dans la fonction n'est pas liée de quelque manière que ce soit à l'ensemble $count variable. Le site static mot-clé est le même qu'en C ou Java, cela signifie : Initialiser cette variable une seule fois et conserver son état lorsque la fonction se termine. Cela signifie que, lorsque l'exécution entre à nouveau dans la fonction, elle voit que l'intérieur $count a déjà été initialisé et stocké la dernière fois en tant que 1 et utilise cette valeur.

42voto

Alix Axel Points 63455
$count = 5; // "outer" count = 5

function get_count()
{
    static $count = 0; // "inner" count = 0 only the first run
    return $count++; // "inner" count + 1
}

echo $count; // "outer" count is still 5 
++$count; // "outer" count is now 6 (but you never echoed it)

echo get_count(); // "inner" count is now + 1 = 1 (0 before the echo)
echo get_count(); // "inner" count is now + 1 = 2 (1 before the echo)
echo get_count(); // "inner" count is now + 1 = 3 (2 before the echo)

J'espère que cela vous éclaircira les idées.

13voto

Thorarin Points 21538

Vous avez deux variables distinctes qui s'appellent toutes les deux $count, mais qui ont une valeur différente. portée . La première variable n'est pas déclarée explicitement, mais elle existe lorsque vous l'assignez pour la première fois.

La deuxième variable (à l'intérieur de la méthode) n'est visible que pour cette méthode. Puisque c'est statique sa valeur est conservée entre plusieurs exécutions de la même méthode. L'affectation $count = 0; n'est exécuté que la première fois que la méthode est exécutée.

Comme pour l'opérateur d'incrémentation (++), le résultat de l'évaluation est la valeur avant il a été incrémenté, car le ( unaire ) vient après le nom de la variable. Donc oui, la sortie serait 5, 0, 1.
Si vous deviez écrire return ++$count; le résultat aurait été 5, 1, 2.

Remarque : le ++$count que vous avez dans votre code existant, cela équivaut effectivement à $count++ puisque le résultat de l'évaluation est écarté. L'effet sur le $count est la même : elle est incrémentée de 1.

13 votes

Horray, quelqu'un a finalement dit "scope" :)

5voto

Steve Fenton Points 55265

Premier écho : Vous donne la variable $count que vous avez déclarée dans votre première ligne.

Deuxième écho : appelle get_count qui crée la variable statique $count (elle est donc dans le contexte de cette fonction) et lorsque vous instanciez la variable statique, vous la mettez à zéro. return $count++ est une de ces lignes que nous évitons habituellement dans le code - mais essentiellement, elle est incrémentée APRÈS que la valeur soit retournée.

Troisième écho : De même, 0 a été incrémenté à 1 après l'appel précédent à get_count, la même chose se produit ici - il retourne 1 et incrémente la valeur à 2.

Est-ce que ça aide ou est-ce que ça rend encore plus confus ?

4 votes

Techniquement, le $count est incrémentée avant que quelque chose ne soit retourné. C'est juste que $count++ est évalué à la valeur de $count avant l'incrémentation.

0voto

Maximilian Mayerl Points 6335

Eh bien, tout d'abord, $count à l'intérieur de la fonction et $count en dehors de la fonction sont 2 variables différentes. Cela explique pourquoi la première sortie imprime 5.

Maintenant pour le statique : Statique signifie que votre variable locale est créée une seule fois, lorsque la fonction s'exécute pour la première fois. Chaque exécution de fonction suivante utilise la même variable, de sorte que les dernières valeurs de la variable lors de la dernière exécution de fonction sont toujours présentes.

Ainsi, lorsque vous appelez d'abord get_count(), la variable est mise à 0 et ensuite retournée. Après le retour, la variable est incrémentée.

Lorsque vous appelez la fonction pour la deuxième fois, la variable est toujours 1. Cette valeur est renvoyée et ensuite incrémentée à 2.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X