W3docs

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; // 3

Tres 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::$count con 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::$count dentro de la clase. Dentro de un método, accedes a la propiedad a través de self::, static:: o parent:: — 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; // 12

Una 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(); // Child

Usa 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::$count anterior 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::$defaultRole global.
  • 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 const para 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 $this en un contexto estático. Los métodos estáticos no tienen $this, por lo que una propiedad estática debe alcanzarse con self::, static:: o parent::.
  • 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 Child arriba) 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.

Práctica

Práctica
¿Qué es correcto sobre las propiedades estáticas de PHP según el contenido de la URL especificada?
¿Qué es correcto sobre las propiedades estáticas de PHP según el contenido de la URL especificada?
Was this page helpful?