Comprensión de las Propiedades Estáticas en PHP OOP
La Programación Orientada a Objetos (OOP) es un paradigma que permite a los desarrolladores crear objetos tratados como instancias de una clase.
Una propiedad estática pertenece a la clase en sí misma y no a ningún objeto creado a partir de ella. Mientras que una propiedad regular (de instancia) tiene su propia copia en cada objeto, una propiedad estática existe exactamente una vez y es compartida por todas las instancias — cámbiala en un lugar y todas las instancias verán el nuevo valor. Esta página explica cómo declarar propiedades estáticas, cómo leerlas y escribirlas, en qué se diferencian self, static y parent, cómo se comportan con la herencia y los errores comunes a tener en cuenta.
Si eres nuevo en las clases de PHP, empieza primero con Clases y Objetos de PHP.
¿Qué es una propiedad estática?
Declaras una propiedad estática con la palabra clave static, combinada con un modificador de visibilidad (public, protected o private):
<?php
class User {
public static int $count = 0;
public function __construct() {
self::$count++;
}
}
new User();
new User();
new User();
echo User::$count; // 3Tres cosas hacen que una propiedad estática sea diferente de una ordinaria:
- Se accede a través de la clase, no de un objeto. Se escribe
User::$countcon el operador de resolución de ámbito::, no$user->count. Intentar leer una propiedad estática mediante el operador flecha ($user->count) no funciona y emite un aviso. - Compartida, no copiada. Cada
new User()incrementa el mismo$count. Solo existe una copia en memoria para toda la clase. - Se referencia como
self::$countdentro de la clase. Dentro de un método, accedes a la propiedad a través deself::,static::oparent::— nunca con$this.
Leer y escribir una propiedad estática
Desde dentro de la clase, usa self::$property. Desde fuera, usa ClassName::$property. Dado que solo hay una copia, una escritura desde cualquier contexto es visible en todas partes:
<?php
class Counter {
public static int $value = 0;
public static function increment(): void {
self::$value++;
}
}
Counter::increment();
Counter::increment();
Counter::$value += 10; // also writable directly from outside
echo Counter::$value; // 12Una propiedad estática puede tener un valor predeterminado, pero ese valor predeterminado debe ser una expresión constante (un literal, una constante o una expresión aritmética const simple) — no puede ser el resultado de una llamada a función o un objeto new.
self:: vs static:: (enlace estático tardío)
Dentro de un método puedes acceder a una propiedad estática con self:: o con static::. Se diferencian cuando hay herencia:
self::se resuelve en tiempo de compilación y siempre apunta a la clase donde el código está escrito.static::usa enlace estático tardío — apunta a la clase sobre la que se llamó el método en tiempo de ejecución.
<?php
class Base {
public static string $label = "Base";
public static function whoAmISelf(): string {
return self::$label; // bound to Base
}
public static function whoAmIStatic(): string {
return static::$label; // bound to the calling class
}
}
class Child extends Base {
public static string $label = "Child";
}
echo Child::whoAmISelf(); // Base
echo "\n";
echo Child::whoAmIStatic(); // ChildUsa static:: cuando quieras que las subclases puedan sobrescribir el valor; usa self:: cuando el valor deba permanecer ligado a la clase que lo declara. Consulta Métodos Estáticos de PHP para más información sobre cómo llamar a miembros estáticos.
¿Cuándo deberías usar propiedades estáticas?
Las propiedades estáticas son ideales cuando un fragmento de estado debe ser compartido entre todas las instancias de una clase:
- Contar instancias — el ejemplo
User::$countanterior rastrea cuántos objetos existen. - Caché / registros — almacena una tabla de búsqueda o un recurso compartido único (por ejemplo, un identificador de conexión a base de datos) para que se cree una vez y se reutilice.
- Configuración o indicadores — un valor predeterminado que aplica a toda la clase, como un
User::$defaultRoleglobal. - El patrón Singleton — una propiedad estática privada guarda la instancia única devuelta por
getInstance().
Si el valor nunca debe cambiar tras la declaración, prefiere una constante de clase (const) — expresa la intención mejor y no puede ser reasignada.
Errores comunes
- Las propiedades estáticas no son constantes. Son mutables; cualquier código con acceso puede reasignarlas. Usa
constpara valores que no deben cambiar. - El estado compartido es un arma de doble filo. Dado que todas las instancias comparten el valor, un cambio en un objeto se refleja en todas partes — conveniente para contadores, peligroso si esperabas datos por objeto.
- No existe
$thisen un contexto estático. Los métodos estáticos no tienen$this, por lo que una propiedad estática debe alcanzarse conself::,static::oparent::. - La herencia comparte el almacenamiento del padre a menos que se redeclare. Una subclase que no redeclara una propiedad estática comparte la copia única del padre; redeclararla (como hace
Childarriba) le da a la subclase la suya propia.
Conclusión
Las propiedades estáticas permiten a una clase mantener un estado compartido por todas sus instancias, al que se accede a través del nombre de clase con el operador :: y mediante self::/static:: dentro de la clase. Son ideales para contadores, cachés, registros y singletons. Recurre a una const de clase cuando el valor deba permanecer fijo, y recuerda que static:: habilita el enlace estático tardío para que las subclases puedan sobrescribir el valor. A continuación, explora Métodos Estáticos de PHP y Herencia en PHP para ver cómo encajan estas piezas.