PHP 8. Todas las novedades de esta nueva versión (I)

Un repaso a fondo de las novedades que tendremos disponibles a partir del 26 de noviembre para trabajar con PHP.

  • Y el uso de “named arguments”.

The match expression

PHP 8 incorpora una alternativa a la sintaxis switch : la expresión match . Al igual que su predecesora, match nos va a permitir ejecutar un bloque de código en función del valor de una determinada variable. Sin embargo, la diferencia es que con match la comprobación será type-safe y estricta, lo cual nos asegura una mayor robustez en la comprobación.

$count = 1;
$message = '';
switch ($count) {
case 0:
$message = 'No books';
break;
case 1:
$message = 'One book';
break;
case 2:
case 3:
$message = 'Some books';
break;
default:
$message = 'So many books';
break;
}
$count = 1;
$message = '';
$message = match($count) {
0 => 'No books',
1 => 'One book',
2,3 => 'Some books',
default => 'So many books'
};
  • Podemos agrupar los casos en la misma línea separándolos por comas.
$count = '1';
$message = '';
$message = match($count) {
0 => 'No books',
1 => 'One book',
2,3 => 'Some books',
default => 'So many books'
};
print_r($message); // 'So many books'
$count = 4;
$message = '';
try {
$message = match($count) {
0 => 'No books',
1 => 'One book',
2,3 => 'Some books'
};
} catch (UnhandledMatchError $exception) {
// handle case
}
$count = '1';
$message = '';
$message = match($count) {
0 => 'No books',
1 => 'One book',
2,3 => 'Some books',
default => throw new Exception('Unknown count')
};
print_r($message); // 'So many books'

Promoted Properties

Las “promoted properties” son una de las características más interesantes que incorpora PHP 8.

<?php

class Article
{
private string $title;
public string $excerpt;

public function __construct(
string $title = 'Empty title',
string $excerpt = 'Empty excerpt'
) {
$this->title = $title;
$this->excerpt = $excerpt;
}
}
<?php

class Article
{
public function __construct(
public string $title = 'Empty title',
private string $excerpt = 'Empty excerpt'
) {}

}
  • Nos ahorramos las líneas donde realizamos la asignación entre las propiedades y los argumentos.

Union Types

Hasta ahora, en PHP no teníamos la manera de definir varios tipos para un argumento. Es decir, si declarábamos la siguiente función:

<?phpdeclare(strict_types=1);function foo(string $var) {
print_r($var);
}
foo('Hola mundo');foo(1); // Uncaught TypeError
<?phpdeclare(strict_types=1);function foo(string|int $var) {
print_r($var);
}
<?phpdeclare(strict_types=1);function foo(Dog|Cat $animal) {
print_r(get_class($animal));
}

Union types como valor de retorno

Además de en los argumentos, podemos usar los “union types” de PHP8 para especificar también el tipo de retorno de las funciones, lo cual es también un gran añadido:

<?phpdeclare(strict_types=1);function foo(string|int $var): string|int {
// do something
return $var;
}

Null y Union Types

En el caso de que queramos aceptar null como posible valor para un “union type” esta sintaxis no es válida:

<?phpdeclare(strict_types=1);// ❌function foo(?string|int $var): string|int {
// do something
return $var;
}
<?phpdeclare(strict_types=1);// ✅function foo(string|int|null $var): string|int {
// do something
return $var;
}

Null Safe Operator

Que levante la mano quien no se haya encontrado con un error similar al siguiente:

class Author
{
private string $name;
public function getName(): string
{
return $this->name;
}
}
class Article
{
private $author;
public function getAuthor():
{
return $this->author;
}
}
$article = new Article();// ❌
$authorName = $article->getAuthor()->getName();
$article = new Article();// ✅
$authorName = $article->getAuthor()?->getName();
class Author
{
private string $name;
public function getName(): string
{
return $this->name;
}
}
class Article
{
public ?Author $author;
}
$article = new Article();// ✅
$authorName = $article?->author->getName();

Named Arguments

Imagina que tenemos la siguiente función:

function log(
string $message,
string $level = 'INFO',
string $date = 'now',
string $prefix = '',
bool $sendByEmail = false
) {
// do something
}
log('Some message', 'INFO', 'now', '', true);
//  👏log('Some message', sendByEmail: true);
log('Some message', sendByEmail: true, prefix: 'PHP8');
class Developer
{
public function __construct(
public string $name,
public string $company,
public string $language
) {}
}
$json = [
'name' => 'Gerardo',
'company' => 'Latte and Code',
'language' => 'PHP'
];
$developer = new Developer(...$json);
class Developer
{
public function __construct(
public string $name,
public string $company,
public string $language
) {}
}
$json = [
'name' => 'Gerardo',
'company' => 'Latte and Code',
'language' => 'PHP',
'age' => 32
];
$developer = new Developer(...$json); // ❌ Unknown parameter $age

Object Classnames

De esta característica ya hablé en el artículo de resumen pero me gustaría volver a recordarla ya que nos permite prescindir del método get_class para obtener el FQDN de un objeto.

namespace App;class Developer
{
public function __construct(
public string $name,
public string $company,
public string $language
) {}
}
$dev = new Developer('Gerardo', 'LaC', 'PHP');get_class($dev); // App\Developer
$dev::class; // App\Developer

Continuará…

Pero esto no termina aquí. En el siguiente capítulo repasaré en profundidad el resto de características que incorpora PHP8:

  • La mejora en el tratamiento de las excepciones.
  • Las nuevas funciones que incorpora la clase String.
  • La interfaz Stringable
  • Los Weak Maps.
  • Y el uso de las “trailing commas” en la definición de las funciones.

Vídeo

Para complementar este artículo he grabado un vídeo donde podéis ver todas estas características funcionando en directo. ¡Espero que os guste!

¿Quieres recibir más artículos como este?

Si te ha gustado este artículo te animo a que te suscribas a la newsletter que envío cada domingo con publicaciones similares a esta y más contenido recomendado: 👇👇👇

Entre paseo y paseo con Simba desarrollo en Symfony y React

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store