Métodos y propiedades estáticos
Parte de la sección Programación Orientada a Objetos del Journey de PHP de Coddy. Lección 17 de 91.
Al igual que las propiedades pueden ser estáticas, los métodos también pueden pertenecer a la propia clase en lugar de a objetos individuales. Los métodos estáticos se invocan directamente en la clase, sin necesidad de crear primero una instancia.
Declaras un método estático utilizando la palabra clave static y lo llamas con el nombre de la clase y el operador :::
<?php
class MathHelper {
public static function add($a, $b) {
return $a + $b;
}
public static function multiply($a, $b) {
return $a * $b;
}
}
echo MathHelper::add(5, 3) . "\n";
echo MathHelper::multiply(4, 2);
Salida:
8
8Los métodos estáticos funcionan bien con las propiedades estáticas. Un patrón común es usar un método estático para gestionar los datos compartidos de la clase:
<?php
class Counter {
private static $count = 0;
public static function increment() {
self::$count++;
}
public static function getCount() {
return self::$count;
}
}
Counter::increment();
Counter::increment();
echo Counter::getCount();
Salida:
2Observa que los métodos estáticos no pueden usar $this porque no existe una instancia de objeto. Solo pueden acceder a propiedades estáticas y a otros métodos estáticos mediante self::.
Punto clave: Los métodos estáticos son útiles para funciones de utilidad que no necesitan el estado del objeto o para gestionar datos a nivel de clase. Proporcionan funcionalidad sin requerir la instanciación de objetos.
Desafío
FácilConstruyamos un sistema generador de ID que utilice métodos y propiedades estáticos para crear identificadores únicos sin necesidad de instanciar objetos.
Crearás dos archivos para organizar tu código:
IdGenerator.php: Define una claseIdGeneratorque gestione la generación de ID únicos utilizando únicamente miembros estáticos. La clase debe tener una propiedad estática privada$lastIdque comience en0y una propiedad estática privada$prefixestablecida en"ID". Crea un método estáticogenerate()que incremente el último ID y devuelva una cadena formateada que combine el prefijo y el nuevo ID (como"ID1","ID2", etc.). Añade un método estáticosetPrefix($newPrefix)que cambie el prefijo y un método estáticogetLastId()que devuelva el valor actual de$lastId.main.php: Incluye el archivo de la clase IdGenerator. Genera dos ID utilizando el prefijo predeterminado e imprime cada uno en su propia línea. Después, cambia el prefijo a"USER"utilizando el método estático, genera dos ID más e imprime cada uno. Finalmente, imprime el número del último ID llamando al método estático correspondiente.
Recuerda que los métodos estáticos se llaman directamente en la clase utilizando ClassName::methodName(), y dentro de la clase accedes a las propiedades estáticas con self::$propertyName. Como no existe una instancia de objeto, no puedes utilizar $this en los métodos estáticos.
Tu salida debe mostrar la progresión de los ID con diferentes prefijos, demostrando cómo las propiedades estáticas mantienen sus valores a través de múltiples llamadas a métodos.
Pruébalo tú mismo
<?php
// Incluye el archivo de la clase IdGenerator
require_once 'IdGenerator.php';
// TODO: Genera dos IDs usando el prefijo predeterminado e imprime cada uno en su propia línea
// TODO: Cambia el prefijo a "USER" usando el método estático
// TODO: Genera dos IDs más e imprime cada uno en su propia línea
// TODO: Imprime el último número de ID usando el método estático apropiado
?>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