Menu
Coddy logo textTech

Propiedades de instancia vs. estáticas

Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy — lección 15 de 91.

Cuando creas una propiedad en una clase, debes decidir si pertenece a cada objeto individual o a la clase misma. Esta distinción es la diferencia entre las propiedades de instancia y las propiedades estáticas.

Las propiedades de instancia son las predeterminadas. Cada objeto obtiene su propia copia de la propiedad, y cambiarla en un objeto no afecta a los demás:

<?php
class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo $alice->name . "\n";
echo $bob->name . "\n";

Salida:

Alice
Bob

Las propiedades estáticas pertenecen a la clase, no a ningún objeto específico. Se declaran con la palabra clave static y se accede a ellas utilizando el nombre de la clase con :: en lugar de un objeto con ->:

<?php
class User {
    public static $count = 0;
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
        self::$count++;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo User::$count;

Salida:

2

Observa cómo $count se comparte entre todas las instancias. Cada vez que creamos un nuevo User, la misma variable $count se incrementa. Dentro de la clase, usamos self::$count para hacer referencia a la propiedad estática.

Punto clave: Usa propiedades de instancia cuando cada objeto necesite su propio valor. Usa propiedades estáticas cuando necesites compartir datos entre todos los objetos de una clase, como contar instancias o almacenar configuraciones.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de seguimiento de visitantes que demuestre la diferencia entre las propiedades de instancia (únicas para cada visitante) y las propiedades estáticas (compartidas entre todos los visitantes).

Crearás dos archivos para organizar tu código:

  • Visitor.php — Define una clase Visitor que rastree a los visitantes individuales y mantenga un recuento acumulado del total de visitantes. Cada visitante debe tener su propia propiedad $name (propiedad de instancia), mientras que una propiedad $totalVisitors debe compartirse entre todas las instancias (propiedad estática). El constructor acepta un nombre, lo asigna e incrementa el recuento total de visitantes. Añade un método getInfo() que devuelva "[name] is visitor #[totalVisitors]".
  • main.php — Incluye el archivo de la clase Visitor, luego crea tres visitantes con los nombres "Alice", "Bob" y "Charlie" (en ese orden). Después de crear los tres, imprime el resultado de llamar a getInfo() en cada visitante (cada uno en su propia línea), luego imprime el recuento total de visitantes accediendo a la propiedad estática directamente desde la clase usando Visitor::$totalVisitors.

Recuerda que dentro de la clase, accedes a las propiedades estáticas usando self::$propertyName, mientras que desde fuera de la clase usas ClassName::$propertyName. Las propiedades de instancia se acceden con $this->propertyName como de costumbre.

Tu salida debería mostrar a cada visitante con su número asignado, seguido por el recuento total final en la última línea.

Hoja de referencia

Las propiedades de instancia pertenecen a cada objeto individual, mientras que las propiedades estáticas pertenecen a la clase misma y se comparten entre todas las instancias.

Propiedades de Instancia:

Cada objeto obtiene su propia copia de la propiedad:

<?php
class User {
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo $alice->name; // Alice
echo $bob->name;   // Bob

Propiedades Estáticas:

Declaradas con la palabra clave static y compartidas entre todas las instancias:

<?php
class User {
    public static $count = 0;
    public $name;
    
    public function __construct($name) {
        $this->name = $name;
        self::$count++;
    }
}

$alice = new User("Alice");
$bob = new User("Bob");

echo User::$count; // 2

Acceso a Propiedades Estáticas:

  • Dentro de la clase: self::$propertyName
  • Fuera de la clase: ClassName::$propertyName

Acceso a Propiedades de Instancia:

  • Dentro de la clase: $this->propertyName
  • Fuera de la clase: $object->propertyName

Pruébalo tú mismo

<?php
// Incluir la clase Visitor
require_once 'Visitor.php';

// TODO: Crear tres visitantes con los nombres "Alice", "Bob" y "Charlie" (en ese orden)

// TODO: Imprimir el resultado de getInfo() para cada visitante (cada uno en su propia línea)

// TODO: Imprimir el recuento total de visitantes usando Visitor::$totalVisitors
?>
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos