Descargo de responsabilidad: este artículo no le revelará ningún tipo de revelación y no le abrirá el tercer ojo, pero le permitirá comprender la pregunta no tan obvia con más detalle. Al menos cuando lo escribí, ella me ayudó en esto. Si eres un lobo experimentado en php, entonces no puedes leerlo, creo que no dañará a las personas experimentadas pasar por sus ojos, refrescarlas en la memoria, por así decirlo, el resto será normal.
Entonces ...
Las variables estáticas en php son un tipo especial de variable que se declara usando la palabra clave estática .
static $foo = 3;
Se diferencian de las variables ordinarias en que (más adelante en el artículo, estos puntos se considerarán con más detalle):
- solo se pueden asignar constantes y expresiones constantes
- La vida útil de una variable estática no se limita a la vida útil del alcance en el que se declaró
- se puede definir en el script solo una vez
- no destruido hasta el final del guión
Ahora en orden.
1. Solo se pueden asignar constantes y expresiones constantes
Esto significa que el resultado de la operación de cualquier función o método no puede asignarse a una variable estática, o en general a algo que aún no se conoce en la etapa de compilación. Es decir, tal anuncio no funcionará
static $var = foo();
pero es muy posible
static $var = 'some str'; static $varInt = 3 + 5;
2. La vida útil de una variable estática no se limita a la vida útil del alcance en el que se declara
Trataré de explicar lo que quise decir aquí. Quizás haré algunas inexactitudes en la terminología, pero intentaré transmitir la esencia con la mayor precisión posible. Compare con una variable regular. Si una variable se declara dentro de una función, por defecto es una variable local, es decir, se declara en el ámbito local (ámbito de esta función). En este caso, el contexto de esta función será el ámbito local. Después de que la función haya funcionado y devuelto el resultado, se destruirá su alcance o contexto, con todas las variables dentro de ella.
Si declaramos una variable estática dentro de la función, también se declara en el ámbito local, pero su contexto no será el ámbito local, sino la función misma.
(Además, el momento más difícil de explicar, solo paso la esencia, sin detalles, cómo se declaran las funciones en php cuánta memoria se les asigna y qué hay en esta memoria). Resulta de esta manera, cuando se llama a una función, el intérprete crea un ámbito local para ella, es allí donde se declaran todas las variables y funciones locales, y se adjuntan a ella en su contexto. Al declarar una variable en el ámbito local usando static, la función misma se asigna a esta variable como contexto, y esta variable existirá mientras exista la función misma. Esto es algo así como js cuando una función es un objeto en el que puede asignar propiedades y métodos arbitrarios. Aquí, también, solo una función en php es un objeto no para php, sino para un lenguaje inferior.
function echoStaticVar() { static $var = 0; $var++; var_dump($var); }; echoStaticVar();
Se puede ver que después de que la función termina, el recopilador no destruye la variable $ var como lo haría con una variable regular.
Y aquí hay un ejemplo que mostrará claramente que una variable estática pertenece a una función (o está almacenada en una función o su contexto es una función, por lo que lamento no saber cómo nombrarla correctamente).
$one = function ($i) { static $var = 0; $var += $i; var_dump($var); }; $two = $one; $one(1);
Todo funciona como se esperaba, porque al asignar $ dos = $ uno; la función en sí no se copia, pero simplemente ambas variables se referirán a la misma área de memoria. En consecuencia, la variable estática $ var será uno para $ uno y $ dos
Cambiamos un poco el ejemplo, es decir, no asignamos, pero clonamos
$one = function ($i) { static $var = 0; $var += $i; var_dump($var); }; $two = clone($one); $one(1);
Ahora resultó que $ uno y $ dos no se refieren a la misma función con una variable estática $ var, sino a dos funciones diferentes que se encuentran en diferentes áreas de memoria y cada una tiene su propia variable estática $ var. Este no es un punto particularmente obvio, por lo que puede tropezar con él si ciertamente escribe código en un estilo de procedimiento, que probablemente ya se considera una mala forma, pero esto no es exacto).
Lo que puede hacer con esto es un ejemplo clásico de un contador de llamadas de función.
Pero en relación con la propagación de OOP en esta forma, las variables estáticas son raras, ya que básicamente tienes que operar con clases y métodos (escribiré un artículo separado sobre la implementación de estática en ellos)
3. se puede definir en el script solo una vez
Esto significa que si una variable estática ya está declarada y se le asigna un valor, las asignaciones posteriores no sobrescribirán el valor ya asignado, sino que devolverán el existente.
function staticVar($i) { static $var = 0; $var += $i; var_dump($var); }; staticVar(1);
Se puede ver que si la variable estática $ var cada vez tuviera un valor reasignado, siempre obtendríamos el resultado 1. Pero como no se reescribe cuando se reasigna, obtenemos lo que obtenemos.
Es cierto que hay una cosa que puede arruinarlo todo. Dentro del marco de una función (más precisamente, la primera vez que se llama a la función), dicha variable se puede reescribir tantas veces como desee (en casos posteriores, todo funcionará como se indica). Este comportamiento me pareció extraño y divertido, especialmente si juegas con ejemplos.
function staticVar($i) { static $var = 0; static $var = 5; $var += $i; var_dump($var); }; staticVar(1);
Aquí se asignó la variable $ var en la primera llamada a la función staticVar en su primera línea, luego se sobrescribió en la segunda línea. Pero ya en otras llamadas, ni en la primera ni en la segunda línea fue reasignada, pero devolvió lo que ya estaba en la llamada anterior.
function staticVar($i) { static $var = 0;
Aún más extraño en la primera llamada de staticVar en la primera línea, se asignó, luego en la segunda línea se reasignó (pero sin éxito), luego se realizó una acción de adición con ella, y después de eso, al intentar reasignarla incluso dentro de la primera llamada de función, devolvió la que ya estaba en su significado
function staticVarWrong($i) { static $var = 0; static $var = 5; $var += $i; var_dump($var); };
Es decir, resulta en casi los mismos métodos, comportamiento diferente. Además, según la descripción de cómo deben comportarse las variables estáticas, se obtiene el resultado correcto en staticVarRight . En staticVarWrong resulta (en función del comportamiento de la función) que en la segunda línea de la función se ha redefinido la variable.
Esto me divirtió bastante.
4. no se destruyen hasta el final del guión
No veo mucho sentido en explicar este punto, especialmente porque todo está claro en los ejemplos. Mientras se ejecuta el script y hay una función para la que se declara una variable estática, esta variable existe.
Según lo planeado, este es el primer artículo sobre métodos estáticos , por delante de OOP, campos estáticos.
Bueno, por supuesto, si es al menos alguien estará interesado y no será difícil culparlo.