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 clase misma en lugar de a objetos individuales. Los métodos estáticos se llaman directamente en la clase, sin necesidad de crear una instancia primero.
Declaras un método estático usando 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 utilizar un método estático para gestionar 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();
Resultado:
2Ten en cuenta que los métodos estáticos no pueden usar $this porque no hay una instancia de objeto. Solo pueden acceder a propiedades estáticas y otros métodos estáticos usando 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 IDs ú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 combinando 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 IDs utilizando el prefijo por defecto e imprime cada uno en su propia línea. Luego, cambia el prefijo a"USER"utilizando el método estático, genera dos IDs más e imprímelos. Finalmente, imprime el último número de ID llamando al método estático correspondiente.
Recuerda que los métodos estáticos se llaman directamente en la clase usando ClassName::methodName(), y dentro de la clase accedes a las propiedades estáticas con self::$propertyName. Dado que no hay una instancia de objeto, no puedes usar $this en métodos estáticos.
Tu salida debería mostrar la progresión de los IDs con diferentes prefijos, demostrando cómo las propiedades estáticas mantienen sus valores a través de múltiples llamadas a métodos.
Hoja de referencia
Los métodos estáticos pertenecen a la clase misma y se llaman sin crear una instancia. Decláralos usando la palabra clave static y llámalos con el nombre de la clase y el operador :::
<?php
class MathHelper {
public static function add($a, $b) {
return $a + $b;
}
}
echo MathHelper::add(5, 3); // 8
Los métodos estáticos pueden acceder a propiedades estáticas usando self:::
<?php
class Counter {
private static $count = 0;
public static function increment() {
self::$count++;
}
public static function getCount() {
return self::$count;
}
}
Counter::increment();
echo Counter::getCount(); // 1
Los métodos estáticos no pueden usar $this porque no hay una instancia del objeto. Solo pueden acceder a propiedades estáticas y otros métodos estáticos usando self::.
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 sin requerir la instanciación del objeto.
Pruébalo tú mismo
<?php
// Incluye el archivo de la clase IdGenerator
require_once 'IdGenerator.php';
// TODO: Generar dos IDs usando el prefijo predeterminado e imprimir cada uno en su propia línea
// TODO: Cambiar el prefijo a "USER" usando el método estático
// TODO: Generar dos IDs más e imprimir cada uno en su propia línea
// TODO: Imprimir 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 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