En PHP, en un método cuyo prototipo es "function X(): static" ¿Qué es el "static"?
En PHP, en la declaración de un método como function X(): static
, el static
después de los dos puntos :
es un tipo de retorno (return type) de PHP 8.0 o superior.
Este tipo de retorno, static
, tiene un significado muy específico y útil en el contexto de la herencia y el polimorfismo.
¿Qué significa static
como tipo de retorno?
El tipo de retorno static
indica que el método debe devolver una instancia de la clase en la que se llama al método, que es la misma clase del objeto que lo invocó. En otras palabras, se refiere al tipo de clase que se resuelve en tiempo de ejecución.
Es una forma de "Self Type Hinting" (indicación de tipo de sí mismo) que permite un comportamiento más flexible y preciso que si usaras self
o el nombre de la clase explícitamente.
static
vs. self
vs. el nombre de la clase (ClassName
)
Para entender mejor, comparemos los tres:
1. self
(el tipo de retorno clásico)
Cuando usas self
como tipo de retorno, el método debe devolver una instancia de la clase en la que se definió el método.
Problema: Si una clase hija hereda este método y lo llama, self
seguirá refiriéndose a la clase padre. Esto rompe la coherencia si el método de la clase hija devuelve una instancia de sí misma.
class ParentClass {
public function create(): self { // Retorna una instancia de ParentClass
return new self();
}
}
class ChildClass extends ParentClass {
// Hereda create(). Si la llamamos desde ChildClass, ¡sigue devolviendo ParentClass!
}
$child = (new ChildClass())->create();
// $child ahora es una instancia de ParentClass, ¡no de ChildClass!
2. ClassName
(el nombre de la clase explícita)
Usar ClassName
como tipo de retorno tiene el mismo problema que self
. El tipo está "fijado" a la clase que se declara.
class ParentClass {
public function create(): ParentClass { // Retorna una instancia de ParentClass
return new ParentClass();
}
}
class ChildClass extends ParentClass {
// El método heredado sigue devolviendo ParentClass, causando el mismo problema.
}
3. static
(el tipo de retorno de PHP 8.0+)
Con static
, el tipo de retorno se resuelve dinámicamente en tiempo de ejecución. El método debe devolver una instancia de la clase que lo invocó.
class ParentClass {
// Con `static`, el tipo se resuelve en tiempo de ejecución
public function create(): static {
// En este caso, `new static()` es lo que queremos
return new static();
}
}
class ChildClass extends ParentClass {
// No necesitamos redefinir el método. El heredado funciona perfectamente.
}
$child = (new ChildClass())->create();
// $child ahora es una instancia de ChildClass. ¡Funciona como esperamos!
Resumen y Casos de Uso
En el prototipo de un método, static
como tipo de retorno es una poderosa herramienta que permite:
Herencia Coherente: Garantiza que los métodos que devuelven instancias de "sí mismos" (como los métodos de fábrica o chaining methods) continúen devolviendo la instancia de la clase hija cuando se heredan.
Encadenamiento de Métodos (
Fluent Interface
): Es ideal para métodos que devuelven el objeto actual (return $this;
) y necesitas que el tipo de retorno sea el de la clase que lo está usando. Constatic
, si una clase hija llama a este método, el tipo de retorno se ajustará a la clase hija, permitiendo el encadenamiento de otros métodos específicos de la clase hija.
En conclusión, el static
en function X(): static
es un tipo de retorno que le dice a PHP: "este método va a devolver una instancia de la misma clase que lo llamó, no necesariamente la clase donde está definido". Es la forma más flexible y correcta de manejar este tipo de situaciones en PHP moderno.