2009-10-29 32 views
40
$count = 5; 
function get_count() 
{ 
    static $count = 0; 
    return $count++; 
} 
echo $count; 
++$count; 
echo get_count(); 
echo get_count(); 

Supongo que produce 5 0 1 y es correcto, pero necesito una mejor explicación?PHP Static Variables

+6

Si esto es tarea, etiquételo como tal. –

+23

No creo que sea su tarea, algunas personas simplemente nunca han usado variables estáticas en PHP (especialmente si se usa para programación de procedimiento directa) –

+6

¿Cuál es el recuento ++ $; haciendo allí? –

Respuesta

70

La variable $count en la función no está relacionado de ninguna clase a lo global $count variable. El static keyword es el mismo que en C o Java, significa: Inicialice esta variable solo una vez y conserve su estado cuando la función finalice. Esto significa que, cuando la ejecución vuelve a entrar en la función, ve que el recuento $ interno ya se ha inicializado y se ha almacenado la última vez como 1, y usa ese valor.

5

Primer eco: le da la variable $ count que declara en su primera línea.

Segundo eco: calles get_count que crea la variable estática $ count (por lo que está en contexto para esta función) y cuando crea una instancia de la variable estática, la establece en cero. return $ count ++ es una de esas líneas que usualmente evitamos en el código, pero esencialmente se incrementa DESPUÉS de que se devuelva el valor.

Tercera eco: De la misma manera, se incrementó 0 a 1 después de la llamada anterior a get_Count, lo mismo sucede aquí - que devuelve 1 y se incrementa el valor a 2.

¿Ayuda o es que en realidad más confuso?

+4

Técnicamente, la variable '$ count' se incrementa antes de que se devuelva algo. Es solo que '$ count ++' evalúa el valor de $ count antes del incremento. – Thorarin

+0

+1 para esa información adicional. – Fenton

0

Bueno, en primer lugar, $ cuenta dentro de la función y el recuento de $ fuera de la función son 2 variables diferentes. Eso explica por qué la primera salida imprime 5.

Ahora, para la estática: estático significa que su variable local se crea solo una vez, cuando la función se ejecuta por primera vez. Cada ejecución de función posterior usa la misma variable, por lo que los últimos valores de la variable en la última ejecución de la función todavía están allí.

Por lo tanto, cuando llame por primera vez a get_count(), la variable se establece en 0 y luego se devuelve. Después del retorno, la variable se incrementa.

Cuando se llama a la función por segunda vez, la variable se fija 1. Se devuelve este valor y luego se incrementa a 2.

13

Tiene dos variables separadas que se llaman $ count, pero tienen un scope diferente. La primera variable no se declara explícitamente, pero aparece cuando la asigna por primera vez.

La segunda variable (dentro del método) solo es visible para ese método. Como es static, su valor se conserva entre varias ejecuciones del mismo método. La asignación $count = 0; solo se ejecuta la primera vez que se ejecuta el método.

cuanto al operador de incremento (++), el resultado de la evaluación es el valor antes de se incrementa, debido a que el (unary) operador viene después del nombre de la variable. Así que sí, la salida sería 5, 0, 1.
Si tuviera que escribir return ++$count;, el resultado habría sido 5, 1, 2.

Nota: el ++$count que tiene en su código existente, es efectivamente equivalente a $count++, ya que el resultado de la evaluación se descarta. El efecto a la variable $count es el mismo: se incrementa en 1.

+13

Horray, alguien finalmente dijo 'alcance' :) –

41
$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) 

Espero que esto aclare su mente.

0

PHP tiene una palabra clave static bien conocida que se usa ampliamente en PHP orientado a objetos para definir métodos y propiedades estáticos, pero se debe tener en cuenta que static también se puede usar dentro de funciones para definir variables estáticas.

¿Qué es 'variable estática'?

Variable estática difiere de la variable ordinaria definido en el alcance de la función en caso de que no lo hace perder valor cuando la ejecución del programa abandona este ámbito. Consideremos el siguiente ejemplo del uso de variables estáticas:

function countSheep($num) { 
static $counter = 0; 
$counter += $num; 
echo "$counter sheep jumped over fence"; 
} 

countSheep(1); 
countSheep(2); 
countSheep(3); 

Resultado:

1 sheep jumped over fence 
3 sheep jumped over fence 
6 sheep jumped over fence 

Si hubiéramos definido $counter sin static continuación, cada vez que el valor eco sería el mismo que $num parámetro pasado a la función . Usar static permite construir este contador simple sin solución adicional.

Las variables estáticas casos de uso

  1. Para almacenar valores entre llamadas consiguientes para funcionar.
  2. para almacenar valores entre llamadas recursivas cuando no hay manera (o ninguna propósito) para pasarlos como params.
  3. para almacenar en caché el valor que normalmente es mejor para recuperar una vez. Para el ejemplo , resultado de leer un archivo inmutable en el servidor. existe

trucos

Variable estática sólo en un ámbito de función local. No puede ser visitada fuera de la función se ha definido. Por lo tanto es posible que estar seguro de que mantendrá su valor sin cambios hasta la siguiente llamada a esa función.

La variable estática solo se puede definir como una expresión escalar o escalar (desde PHP 5.6). Asignar otros valores que inevitablemente conduce a un fracaso, al menos en el momento de escribir este artículo. obstante que son capaces de hacerlo sólo en la siguiente línea de código:

function countSheep($num) { 
    static $counter = 0; 
    $counter += sqrt($num);//imagine we need to take root of our sheep each time 
    echo "$counter sheep jumped over fence"; 
} 

Resultado:

2 sheep jumped over fence 
5 sheep jumped over fence 
9 sheep jumped over fence 

función estática es un poco 'compartida' entre los métodos de los objetos de la misma clase . Es fácil de entender al ver el siguiente ejemplo:

class SomeClass { 
    public function foo() { 
    static $x = 0; 
    echo ++$x; 
    } 
} 

$object1 = new SomeClass; 
$object2 = new SomeClass; 

$object1->foo(); // 1 
$object2->foo(); // 2 oops, $object2 uses the same static $x as $object1 
$object1->foo(); // 3 now $object1 increments $x 
$object2->foo(); // 4 and now his twin brother 

Esto solo funciona con objetos de la misma clase. Si los objetos son de diferentes clases (incluso se extienden entre sí), el comportamiento de vars estáticos será el esperado.

¿La variable estática es la única manera de mantener los valores entre las llamadas a una función?

Otra forma de mantener los valores entre las llamadas a funciones es utilizar cierres. Los cierres se introdujeron en PHP 5.3. En dos palabras, le permiten limitar el acceso a un conjunto de variables dentro de un ámbito de función a otra función anónima que será la única forma de acceder a ellas. Estar en variables de cierre puede imitar (más o menos exitosamente) conceptos de OOP como 'constantes de clase' (si se aprobaron en el cierre por valor) o 'propiedades privadas' (si se pasan por referencia) en la programación estructurada.

Este último realmente permite utilizar cierres en lugar de variables estáticas. Qué usar siempre depende del desarrollador decidir, pero se debe mencionar que las variables estáticas son definitivamente útiles cuando se trabaja con recursiones y merecen ser notadas por los desarrolladores.