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 en sí. Esta distinción es la diferencia entre las propiedades de instancia y las propiedades estáticas.
Las propiedades de cada instancia son las no 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. Las declaras con la palabra clave static y accedes a ellas usando 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 la configuración.
Desafío
FácilConstruyamos 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 claseVisitorque registre a los visitantes individuales y mantenga un conteo acumulado del total de visitantes. Cada visitante debe tener su propia propiedad$name(propiedad de instancia), mientras que la propiedad$totalVisitorsdebe compartirse entre todas las instancias (propiedad estática). El constructor acepta un nombre, lo establece e incrementa el conteo total de visitantes. Agrega un métodogetInfo()que devuelva"[name] is visitor #[totalVisitors]".main.php: Incluye el archivo de la clase Visitor y, después, crea tres visitantes con los nombres"Alice","Bob"y"Charlie"(en ese orden). Después de crear los tres, imprime el resultado de llamar agetInfo()en cada visitante (cada uno en su propia línea); después, imprime el conteo total de visitantes accediendo directamente a la propiedad estática de la clase medianteVisitor::$totalVisitors.
Recuerda que dentro de la clase accedes a las propiedades estáticas mediante self::$propertyName, mientras que desde fuera de la clase usas ClassName::$propertyName. A las propiedades de instancia se accede con $this->propertyName, como de costumbre.
Tu salida debe mostrar cada visitante con su número asignado, seguido del conteo total final en la última línea.
Pruébalo tú mismo
<?php
// Incluye la clase Visitor
require_once 'Visitor.php';
// TODO: Crea tres visitantes con los nombres "Alice", "Bob" y "Charlie" (en ese orden)
// TODO: Imprime el resultado de getInfo() para cada visitante (cada uno en su propia línea)
// TODO: Imprime el conteo total de visitantes usando Visitor::$totalVisitors
?>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
1Fundamentos de la POO
Archivos externosIntroducción a la POOClases frente a objetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Repaso: calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasRepaso - Jerarquía de empleados7Encapsulación
Público, protegido, privadoModificadores de acceso en profundidadGetters y settersOcultación de la informaciónPromoción del constructor (8.0)Repaso: sistema de registros de estudiantes10Conceptos avanzados de OOP
Composición vs. herenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibras (PHP 8.1)Análisis profundo de la clonación de objetosGeneradores e iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Namespaces y carga automática
Introducción a los NamespacesLa palabra clave useEstándar de carga automática PSR-4Autoloader de ComposerRepaso: proyecto organizado5Interfaces y contratos
Introducción a las interfacesImplementación de interfacesImplementación de múltiples interfacesInterfaces vs. clase abstractaTipado con interfacesRepaso - Calculadora de formas8Métodos mágicos
Introducción a los métodos mágicos__toString y __debugInfo__get, __set, __isset, __unset__call y __callStatic__clone y clonación de objetos__serialize y __unserializeRepaso: colección personalizada3Propiedades de clase
Propiedades de instancia vs. estáticasConstantes en clasesMétodos y propiedades estáticosPropiedades privadas y protegidasPropiedades de solo lectura (PHP 8.1)Repaso: gestor de cuentas bancarias6Polimorfismo
Repaso de la sobrescritura de métodosPolimorfismo mediante interfacesAnotaciones de tipo y tipos uniónEnlace estático tardíoRepaso: procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos entre TraitsMétodos abstractos en TraitsTraits frente a la herencia12Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de PHP online