Mostrando entradas con la etiqueta static. Mostrar todas las entradas
Mostrando entradas con la etiqueta static. Mostrar todas las entradas

jueves, 31 de julio de 2025

Tipo de retorno static para métodos de instancia de clases (PHP 8.0)

 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.

PHP
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.

PHP
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ó.

PHP
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. Con static, 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.