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.
Desafío
FácilVamos 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 claseVisitorque 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$totalVisitorsdebe 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étodogetInfo()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 agetInfo()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 usandoVisitor::$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
?>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 OOP
Archivos externosIntroducción a OOPClases vs ObjetosLa palabra clave $thisMétodosPropiedadesConstructor (__construct)Destructor (__destruct)Resumen - Calculadora simple4Herencia
Herencia básicaLa palabra clave parent::Sobrescritura de métodosLa palabra clave finalClases abstractasResumen - Jerarquía de empleados7Encapsulamiento
Público, Protegido, PrivadoModificadores de acceso a fondoGetters y SettersOcultamiento de informaciónPromoción de constructor (8.0)Resumen - Sistema de registros de estudiantes10Conceptos avanzados de POO
Composición vs. HerenciaInyección de dependenciasClases anónimasEnums (PHP 8.1)Fibers (PHP 8.1)Clonación de objetos a fondoGeneradores e Iteradores13Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Repository2Espacios de nombres y Autoloading
Introducción a los espacios de nombresLa palabra clave useEstándar de Autoloading PSR-4Autoloader de ComposerResumen - Proyecto organizado5Interfaces y Contratos
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesInterfaz vs Clase AbstractaType Hinting con InterfacesResumen - 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 __unserializeResumen - 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)Resumen - Gestor de cuenta bancaria6Polimorfismo
Sobrescritura de métodos revisadaPolimorfismo mediante interfacesType Hinting y tipos de uniónEnlace estático tardíoResumen - Procesador de pagos9Traits
Introducción a los TraitsUso de múltiples TraitsResolución de conflictos de TraitsMétodos abstractos en TraitsTraits frente a herencia12Patrones de diseño Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón Strategy