Como ya hemos visto, antes de declarar un atributo o un método podemos usar public, private y protected, pero es posible que en algún momento hayas visto la palabra reservada static acompañando a estas en la declaración.

Al igual que las constantes, los* elementos estáticos* no dependen del objeto instanciado, si no que son únicos para todos los objetos de una misma clase. Esto podré explicarlo mejor con un sencillo ejemplo:

atributo; //Imprime 0 //Muestro los valores del objeto b echo $b::$miAtributo; //Imprime 0 echo $b->atributo; //Imprime 0 //Altero los Atributos del objeto a $a::$miAtributo++; $a->atributo++; //Altero los Atributos del objeto b $b::$miAtributo++; $b->atributo++; //Muestro los valores echo $a->atributo; //Imprime 1 echo $b->atributo; //Imprime 1 //Muestro el valor de la Atributo estatica echo MiClase::$miAtributo; //Imprime 2 echo $a::$miAtributo; //Imprime 2 echo $a::$miAtributo; //Imprime 2 ?>

Como se puede apreciar usamos una sintaxis similar para llamar a un atributo estático que para llamar a una constante, usando el operador “::”, pero en el caso del atributo hemos de añadir llamarlo con el símbolo del dólar ($) incluido, así: MiClase::$miAtributo.

Nuestro ejemplo debe de imprimir en pantalla esta secuencia de números “000011222”. Los cuatro primeros ceros (0000) son los valores por defecto de los atributos, aunque se muestren 4 valores en realidad son 3, porque la variable estática es la misma para los dos objetos, esto lo vemos más claro en la siguiente secuencia, donde se imprimen dos unos (11) para mostrar el valor de las variables propias de cada objeto y tres dos (222) como referencia al valor de la variable estática. ¿Por qué su valor es dos, si en cada objeto solo sumamos uno? Aunque manipulemos diferentes objetos al ser un atributo estático estamos usando el mismo para todos.

De la misma forma que declaramos atributos estáticos podemos declarar métodos. Hemos de añadir la palabra static en la declaración antes del nombre del método, así:

La principal ventaja de los métodos estáticos es que se llaman directamente sin necesidad de crear el objeto, esto junto a los atributos estáticos puede ser muy útil para diversos usos, por ejemplo contar el numero de veces que se instancia una clase, o el famoso patrón de diseño Singleton, os dejo aquí un link al blog de Alberto Varela donde lo explica muy bien (y daros una vuelta que tiene muchos tips interesantes).

Para referirnos a un elemento estático desde el interior de clase no podemos usar el $this como hacemos normalmente con los elementos de los objetos, debemos de usar self, o el nombre de la clase, como siempre digo, se ve mejor con un ejemplo:

class MiClase { public static $miAtributo = true; public static function miMetodo(){ echo "Mi método estatico"; } public function go(){ if(self::$miAtributo){ self::miMetodo(); } } }