Ya vimos las novedades que llegarán con PHP 8. Son cambios grandes, algunos de ellos romperán nuestro código actual y otros lo cambiarán. Así quedará nuestro código con la llegada de la nueva versión de PHP.

La versión final de PHP 8 se espera para el 26 de noviembre, 2020.

Propagación de propiedades automática

Ahora mismo, antes de tener la octava versión de PHP, es muy habitual crear métodos estáticos para construir nuestras clases con algo más de semántica. Además tenemos que añadir mucho código para tipar las propiedades.

class CustomerData extends DataTransferObject
{
    public string $name;

    public string $email;

    public int $age;
    
    public static function fromRequest(
        CustomerRequest $request
    ): self {
        return new self([
            'name' => $request->get('name'),
            'email' => $request->get('email'),
            'age' => $request->get('age'),
        ]);
    }
}

$data = CustomerData::fromRequest($customerRequest);

Con PHP 8 todo esto se simplifica, ya que el constructor automáticamente propaga las propiedades y, como ya están tipadas, no es necesario declararlas.

class CustomerData
{
    public function __construct(
        public string $name,
        public string $email,
        public int $age,
    ) {}
}

$data = new CustomerData(...$customerRequest->validated());

Union types

Desde que podemos tipar las propiedades y respuestas de las funciones cada vez es menos habitual usar los comentarios de PHP para tipar las variables. Ahora mismo nos vemos obligados a hacerlo cuando la respuesta es variable y no es de un solo tipo.

/**
 * @param string|int $input
 *
 * @return string 
 */
public function sanitize($input): string;

Con PHP 8 podremos usar los union types y eliminar, casi por completo, los comentarios.

public function sanitize(string|int $input): string;

Throw ahora puede usarse en expresiones

Anteriormente no podíamos usar el throw en una expresión y nos obligaba a hacer cosas como esta:

public function (array $input): void
{
    if (! isset($input['bar'])) {
        throw BarIsMissing::new();
    }
    
    $bar = $input['bar'];

    // …
}

Con PHP 8 podremos hacer cosas como esta.

public function (array $input): void
{
    $bar = $input['bar'] ?? throw BarIsMissing::new();

    // …
}

Nuevo operador nullsafe

Si programas con PHP seguro que más de una vez te has visto anidando ifs para comprobar que un getter no te devulve null.

$startDate = $booking->getStartDate();

$dateAsString = $startDate ? $startDate->asDateTimeString() : null;

Gracias al nuevo operador nullsafe podemos hacer cosas como estas. Al final, el primero getter que devuelva null parará la ejecución sin devolver ningún error.

$dateAsString = $booking->getStartDate()?->asDateTimeString();