Released!
PHP 8.0 è una nuova versione major del linguaggio PHP.
Contiene molte nuove funzionalità ed ottimizzazioni quali i named arguments, la definizione di tipi unione, gli attributi, la promozione a proprietà degli argomenti del costruttore, l'espressione match, l'operatore nullsafe, la compilazione JIT e miglioramenti al sistema dei tipi, alla gestione degli errori e alla consistenza.

Named arguments RFC

PHP 7
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
PHP 8
htmlspecialchars($string, double_encode: false);
  • Indica solamente i parametri richiesti, saltando quelli opzionali.
  • Gli argomenti sono indipendenti dall'ordine e auto-documentati.

Attributi RFC Doc

PHP 7
class PostsController
{
/**
* @Route("/api/posts/{id}", methods={"GET"})
*/
public function get($id) { /* ... */ }
}
PHP 8
class PostsController
{
#[
Route("/api/posts/{id}", methods: ["GET"])]
public function
get($id) { /* ... */ }
}

Invece delle annotazioni PHPDoc, ora puoi usare metadati strutturati nella sintassi nativa PHP.

Promozione a proprietà degli argomenti del costruttore RFC Doc

PHP 7
class Point {
public
float $x;
public
float $y;
public
float $z;

public function
__construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}
PHP 8
class Point {
public function
__construct(
public
float $x = 0.0,
public
float $y = 0.0,
public
float $z = 0.0,
) {}
}

Meno ripetizioni di codice per definire ed inizializzare le proprietà.

Tipi unione RFC Doc

PHP 7
class Number {
/** @var int|float */
private $number;

/**
* @param float|int $number
*/
public function __construct($number) {
$this->number = $number;
}
}

new
Number('NaN'); // Ok
PHP 8
class Number {
public function
__construct(
private
int|float $number
) {}
}

new
Number('NaN'); // TypeError

Invece di indicare una combinazione di tipi con le annotazioni PHPDoc, puoi usare una dichiarazione nativa di tipo unione che viene validato durante l'esecuzione.

Espressione match RFC Doc

PHP 7
switch (8.0) {
case
'8.0':
$result = "Oh no!";
break;
case
8.0:
$result = "This is what I expected";
break;
}
echo
$result;
//> Oh no!
PHP 8
echo match (8.0) {
'8.0' => "Oh no!",
8.0 => "This is what I expected",
};
//> This is what I expected

La nuova espressione match è simile allo switch e ha le seguenti funzionalità:

  • Match è un'espressione, ovvero il suo risultato può essere salvato in una variabile o ritornato.
  • I rami del match supportano solo espressioni a singola linea e non necessitano di un'espressione break;.
  • Match esegue comparazioni strict.

Operatore nullsafe RFC

PHP 7
$country = null;

if (
$session !== null) {
$user = $session->user;

if (
$user !== null) {
$address = $user->getAddress();

if (
$address !== null) {
$country = $address->country;
}
}
}
PHP 8
$country = $session?->user?->getAddress()?->country;

Invece di controllare la presenza di un null, puoi ora usare una catena di chiamate con il nuovo operatore nullsafe. Quando la valutazione di un elemento della catena fallisce, l'esecuzione della catena si interrompe e l'intera catena restituisce il valore null.

Comparazioni più coerenti di stringhe e numeri RFC

PHP 7
0 == 'foobar' // true
PHP 8
0 == 'foobar' // false

Nella comparazione di una stringa numerica, PHP 8 usa la comparazione numerica. Altrimenti, converte il numero in una stringa e usa la comparazione tra stringhe.

Tipi di errori consistenti per le funzioni native RFC

PHP 7
strlen([]); // Warning: strlen() expects parameter 1 to be string, array given

array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0
PHP 8
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given

array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0

La maggior parte delle funzioni native ora lanciano una eccezione Error se la validazione degli argomenti fallisce.

Compilazione Just-In-Time

PHP 8 intrduce due motori di compilazione JIT. Tracing JIT, il più promettente dei due, mostra delle prestazioni 3 volte superiori nei benchmarks sintetici e 1.5–2 volte superiori per alcuni specifici processi applicativi a lunga esecuzione. Le prestazioni delle tipiche applicazioni web sono al pari con PHP 7.4.

Miglioramenti delle performance in PHP 8 grazie a JIT

Just-In-Time compilation

Sistema dei tipi e miglioramenti alla gestione degli errori

  • Controlli più stringenti per gli operatori aritmetici e bitwise RFC
  • Validazione dei metodi astratti nei trait RFC
  • Firme corrette nei metodi magici RFC
  • Riclassificazione degli errori RFC
  • Errori fatali per firme di metodi non compatibili RFC
  • L'operatore @ non silenzia più gli errori fatali.
  • Ereditarietà e metodi privati RFC
  • Tipo mixed RFC
  • Tipo di ritorno static RFC
  • Tipi per le funzioni native Email thread
  • Oggetti opachi invece che risorse per le estensioni Curl, Gd, Sockets, OpenSSL, XMLWriter, e XML

Altre ritocchi e migliorie di sintassi

  • Permessa una virgola finale nella lista dei parametri RFC e nell'espressione use per le closure RFC
  • Catch senza argomento RFC
  • Correzioni alla sintassi di variabile RFC
  • Trattamento dei nomi di namespace come un singolo token RFC
  • Throw è ora un'espressione RFC
  • Permesso l'utilizzo di ::class sugli oggetti RFC

Nuove classi, interfacce e funzioni

To Top