PHP 8.0: le novità della nuova versione

Introduzione

PHP è un linguaggio in costante evoluzione, con aggiornamenti rilasciati periodicamente per migliorare le prestazioni, aggiungere nuove funzionalità e aumentare la sicurezza. Ogni versione Major, come PHP 8.0, introduce cambiamenti significativi rispetto alle versioni precedenti. PHP 8.0, rilasciato nel novembre 2020, rappresenta una delle release più importanti degli ultimi anni, con numerosi aggiornamenti al linguaggio e nuove funzionalità.

1. JIT Compiler (Just-In-Time)

Una delle principali novità di PHP 8.0 è l’integrazione di un JIT Compiler, che migliora le prestazioni del codice PHP compilando parti di esso in tempo reale. Il JIT può ridurre il tempo di esecuzione di script complessi, soprattutto in ambiti di elaborazione intensiva.
Documentazione ufficiale: JIT Compiler.
JIT è implementato nell’estensione Opcache, ed è necessario che l’estensione php Opcache sia attivata.


opcache.enable=1
opcache.enable_cli=1
opcache.jit_buffer_size = 100M
opcache.jit = tracing

2. Operatore Nullsafe

L’operatore nullsafe consente di evitare errori di accesso a proprietà o metodi su oggetti nulli. È una soluzione compatta per la gestione del valore null.
L’operatore nullsafe consente di compattare il codice nei casi in cui bisogna verificare se un oggetto è null prima di accedere alle sue proprietà.


$userName = $user?->profile?->getName();


$country =  null;
if ($session !== null) {
    $user = $session->user;
     if ($user !== null) {
        $address = $user->getAddress();
         if ($address !== null) {
            $country = $address->country;
        }
    }
}
// do something with $country

// con l'operatore nullsafe il codice di prima si puo riscrivere in forma più compatta così:
$country = $session?->user?->getAddress()?->country;
// do something with $country




3. Named Arguments

PHP 8.0 introduce i named arguments, che permettono di specificare i valori degli argomenti associandoli direttamente ai loro nomi.
I Named Arguments consentono di passare argomenti a una funzione in base al nome del parametro, anziché alla posizione del parametro, ciò rende rende gli argomenti indipendenti dall’ordine in cui sono definiti nella firma della funzione. Inoltre, nel caso di di parametri opzionali con valori predefiniti, consente passare solo gli argomenti desiderati, saltando arbitrariamente i valori predefiniti.
Questa funzionalità migliora la leggibilità e la flessibilità del codice.


function createUser(string $name, int $age, bool $isActive) {
    // Creazione utente
}
createUser(age: 30, name: "Mario", isActive: true);

Questo esempio di codice (che utilizz htmlspecialchars): mostra che non è piu necessario specificare tutti i valori predefiniti fino a quello che si vuole modificare. Gli Named Arguments consentono di sovrascrivere direttamente solo i valori predefiniti che si desidera modificare rispetto al valore di default.


htmlspecialchars — Convert special characters to HTML entities
htmlspecialchars(
    string $string,
    int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
    ?string $encoding = null,
    bool $double_encode = true
): string

// con Named Arguments
htmlspecialchars($string, double_encode: false);
// senza Named Arguments 
htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, null, false);


4. Union Types

Con union types è possibile specificare più tipi di dati sia per un parametro di input che per il valore di ritorno di una funzione.


function processInput(int|string $input): int|string {
    // Logica di elaborazione
}

5. Funzione str_contains

PHP 8.0 introduce la funzione str_contains per verificare se una stringa contiene un’altra stringa. Questa funzione è molto utile per la gestione di stringhe e sostituisce soluzioni meno leggibili.


$result = str_contains("Hello, World!", "World"); // true

6. Funzione match

La nuova funzione match introduce un’espressione di controllo simile a switch, ma con una sintassi più pulita e flessibile, la funzione crestituisce l’esito del match che puo richiamare a sua volta una funzione.


$action = match ($status) {
    1 => 'Active',
    2 => 'Inactive',
    default => 'Unknown',
};

Conclusione

PHP 8.0 è una versione ricca di innovazioni, che migliora le prestazioni del linguaggio e semplifica la scrittura del codice.

Riferimenti Utili

PHP 7.4: le novità della nuova versione

Le versioni Minor di PHP apportano miglioramenti incrementali, nuove funzionalità e spesso ottimizzazioni per una maggiore efficienza. PHP 7.4 introduce una serie di novità significative che migliorano la leggibilità del codice e aggiungono nuove funzionalità potenti.

1. Proprietà Tipizzate

Con PHP 7.4 è possibile dichiarare tipi di proprietà nelle classi, specificando il tipo di dato che una proprietà deve accettare, altrimenti un TypeError viene generato. Questa funzionalità aumenta la sicurezza del codice, facilitando la gestione dei tipi.
Documentazione ufficiale: Proprietà Tipizzate.


class User {
    public int $id;
    public string $name;
}
$u = new User();
$u->id = 1; //Ok
$u->id = "Carlo"; //PHP Fatal error:  Uncaught TypeError: Cannot assign string to property User::$id of type int

Vale la pena di spendere qualche parola su questa novità in quanto rappresenta secondo me una pietra miliare per l’evoluzione di php in quanto segna il passaggio definitivo da linguaggio non tipizzato a linguaggio tipizzato. Si tratta di una delle novità più attese dai programmatori, in quanto la mancanza di tipizzazione è da sempre avvertita come una delle carenze relegano php a linguaggio meno enterprise di altri. L’introduzione della tipizzazione è stata attuata in modo estremamente flessibile in quanto viene lasciata la libertà al programmatore sia se e quali variabili tipizzare, e sia in quale modalità: strict / no strict mode.
Sono supportati tutti i tipi di php: int, string, bool, float, array, iterable, object, classi, interfacce, stdClass, riferimenti alla stessa classe: self, parent. Non sono supportati i tipi Resource ormai in disuso, e i callable.
Le prorietà possono essere inizializzate al momento della dichiarazione con un valore statico.



class Foo
{
    public int $a;

    public ?string $b = 'foo';

    private Foo $prop;

    protected static string $static = 'default';
}

Una proprietà di classe tipizzata a cui non è stato assegnato un valore si trova nello stato non inizializzato.
Non è consentito accedere ad una proprietà tipizzata non inizializzata in quanto verrebbe generato un errore; es.: if($foo->a == null) genera un errore.
Per verificare se una variabile è inizializzata si può ricorrere a isset($foo->a)

2. Operatore di assegnazione Null coalescing (??=)

L’operatore ??= consente di assegnare un valore a una variabile solo se essa non è definita o è null.
Documentazione ufficiale: Operatore di assegnazione Null Coalescing.


$var ??= 'default';
//è equivalente a 
if (!isset($var)) {
    $var = 'default';
}

3. Funzione fgetcsv() migliorata

In PHP 7.4, la funzione fgetcsv() accetta il parametro $escape per gestire l’output dei dati. Il parametro $escape ha il valore predefinito ‘\\’ ma puo essere impostato con una stringa vuota per disattivare il meccanismo di escape tramite backslash.


$file = fopen('file.csv', 'r');
while (($data = fgetcsv($file, 1000, ',', '"', '\\')) !== false) {
    print_r($data);
}
fclose($file);

4. Funzioni Arrow

Le funzioni arrow forniscono una sintassi compatta per definire funzioni anonime, ereditando le variabili dall’ambiente di contesto. Questa sintassi è utile per evitare il passaggio esplicito delle variabili.


$factor = 10;
$calc = fn($n) => $n * $factor;
$res = $calc(5);

5. Espressione Spread per Array

La sintassi spread per array, introdotta in PHP 7.4, consente di espandere array all’interno di altri array in modo molto più efficiente. Questa funzionalità è utile per combinare array o aggiungere elementi senza usare array_merge().
Documentazione ufficiale: Espressione Spread per Array.


$array1 = [1, 2, 3];
$array2 = [...$array1, 4, 5];

6. Estensione FFI (Foreign Function Interface)

PHP 7.4 introduce l’estensione FFI, che consente di chiamare funzioni scritte in altri linguaggi (come C) direttamente in PHP. Questa funzionalità è utile per interagire con librerie di basso livello o di sistema senza la necessità di estensioni personalizzate.


$ffi = FFI::cdef(
    "int add(int a, int b);",
    "libadd.so"
);
echo $ffi->add(2, 3);

Conclusione

PHP 7.4 rappresenta un importante passo avanti, introducendo funzionalità che rafforzano il linguaggio e offrono strumenti moderni agli sviluppatori per creare applicazioni più efficienti e sicure.

Riferimenti Utili

PHP 7.3: le novità della nuova versione

Introduzione

Le versioni Minor di PHP rappresentano una continua evoluzione del linguaggio, introducendo nuove funzionalità che ne migliorano la flessibilità e l’efficienza. PHP 7.3, in particolare, porta innovazioni che rendono la sintassi del linguaggio più chiara e semplificano la gestione delle operazioni complesse.

1. Funzione array_key_first() e array_key_last()

PHP 7.3 ha introdotto le nuove funzioni array_key_first() e array_key_last(), che consentono di ottenere rispettivamente la prima e l’ultima chiave di un array senza dover contare o iterare. Questa funzionalità semplifica le operazioni sugli array.


$arr = ['a' => 1, 'b' => 2, 'c' => 3];
$firstKey = array_key_first($arr); // Ritorna 'a'
$lastKey = array_key_last($arr);   // Ritorna 'c'

2. Espressione is_countable()

Con PHP 7.3 è stata introdotta la funzione is_countable(), che verifica se una variabile può essere contata. Questa novità elimina la necessità di scrivere controlli extra per evitare errori quando si utilizza la funzione count().


$data = [1, 2, 3];
if (is_countable($data)) {
    echo count($data);
}

3. Espressioni Flexible Heredoc e Nowdoc

PHP 7.3 ha migliorato la sintassi heredoc e nowdoc. A partire dalla versione 7.3 l’indentazione del testo parte dall’indentazione del marker di chiusura dell’ heredoc / nowdoc.


$text = <<<EOD
    Questo è un esempio
      di testo con heredoc
      in PHP 7.3.
  EOD;

4. Miglioramenti alla Sicurezza

PHP 7.3 ha introdotto vari miglioramenti in tema di sicurezza, tra cui il supporto per l’algoritmo di hashing Argon2id, che rappresenta un’evoluzione degli algoritmi precedenti ed è stato ottimizzato per la protezione delle password.


$hash = password_hash('password123', PASSWORD_ARGON2ID);

Conclusione

PHP 7.3 ha introdotto miglioramenti che semplificano la gestione dei dati e aumentano la sicurezza.

Riferimenti Utili