PHP 8.2 SiteGround

Dec 08, 2022 • 6 min read

0 commenti

PHP 8.2 disponibile sui server SiteGround

Siamo lieti di annunciare che PHP 8.2 è ora considerato stabile ed è stato distribuito su tutti i server SiteGround. Ancora una volta, siamo tra le prime aziende ad averlo già disponibile sulla nostra piattaforma di hosting. Leggi l’articolo qui sotto per saperne di più sulle nuove funzionalità dell’ultima versione di PHP.

È arrivato il momento dell’anno che tutti i buoni sviluppatori PHP stavano aspettando! Babbo (ElePHPant) Natale è arrivato come al solito in anticipo in SiteGround e ha portato tante nuove chicche che rendono più facile per gli sviluppatori lavorare sui loro progetti.

PHP 8.2 è ora stabile e disponibile sui server SiteGround. Diamo un’occhiata ad alcune delle novità in arrivo.

Nuove Funzionalità

Per prima cosa, diamo un’occhiata ad alcune delle nuove funzionalità che saranno maggiormente interessanti per gli sviluppatori PHP. Questo non è un elenco esaustivo delle novità. È più che altro un breve elenco di cose a cui penso che la maggior parte degli sviluppatori PHP sarà interessata.

Classi readonly

In PHP 8.1 abbiamo le proprietà readonly per le classi. Questo è stato un grande balzo in avanti per molti progetti. Tuttavia, c’è ancora un piccolo buco che doveva essere tappato, le classi. Sì, puoi rendere ogni proprietà digitata in una classe di sola lettura e sei a posto, ma onestamente questo richiede un sacco di scrittura e molti come me sono abbastanza pigri. Con PHP 8.2 possiamo invece contrassegnare un’intera classe come readonly.

readonly class MyClass {
    public int $myProp;
    public string $myOtherProp;
    public __construct(string $myOtherProp, int $myProp) 
    {
        $this->myProp = $myProp;
        $this->myOtherProp = $myOtherProp;
    }
}

Qui abbiamo una classe definita come readonly. Abbiamo 2 proprietà della classe ed entrambe sono intrinsecamente readonly. Si applicano ancora le regole di sola lettura di PHP 8.1 ed è possibile inizializzare la proprietà solo una volta, dopodiché è stata impostata.

$myObj = new MyClass(‘Cal era qui’,42);

Tuttavia, una volta inizializzate, ora sono immutabili.

$myObj->myProp = ‘Cal non è più qui’;

// Fatal Error: Uncaught Error: Cannot modify readonly property MyClass::myProp

Un altro comportamento della classe readonly è che le proprietà non possono mai essere aggiunte dinamicamente alla classe. Di seguito parliamo della deprecazione delle proprietà dinamiche e di come questa sia una buona cosa. C’è anche un’annotazione che ti consente di ignorarla. Tuttavia, se si contrassegna una classe come readonly, non è possibile sovrascriverla.

Costanti nei Traits

I Traits sono con noi da PHP 5.4. Sono stati a lungo la risposta alla “composizione sull’eredità”. Ora i traits stanno ottenendo una nuova interessante funzionalità, la capacità di definire le costanti in un trait.

trait MyTrait {

    private const MY_CONSTANT = 42;

}

Ora, se il tuo trait utilizza una costante, puoi definirlo nel trait e non devi ricordarti di definirlo in ogni classe che utilizza il trait.

trait MyTrait {

    private const MY_CONSTANT = 42;

    public function meaningOfLife() : int

    {

        return self::MY_CONSTANT;

    }

}

class MyClass {

    use MyTrait;

}

$myObj = new MyClass();

echo $myObj->meaningOfLife(); // prints 42

Come ogni cosa nella vita, ci sono alcune regole.

I trait possono definire costanti di classe. Se una classe utilizza quel trait, può anche definire la stessa costante di classe purché sia ​​la visibilità sia il valore siano esattamente gli stessi. Quindi l’esempio sopra funziona ma quello sotto riporterà un errore irreversibile.

trait MyTrait {

    private const MY_CONSTANT = 42;

    public function meaningOfLife() : int

    {

        return self::MY_CONSTANT;

    }

}

class MyClass {

    use MyTrait;

    public const MY_CONSTANT = 42;

}

Eppure, anche con le regole che devi seguire, questo è un vero passo avanti. I traits sono un ottimo modo per condividere il codice tra le classi e ora sono ancora più autonomi.

Estensione casuale 5.x + Miglioramento dell’estensione casuale

Il generatore di numeri casuali di PHP originale è ancora nel codice di base. Non è mai stato fantastico ed è assolutamente inutile per usi crittografici. Con PHP 7, abbiamo avuto un paio di nuove funzioni, random_int() e random_bytes(). Hanno fatto molto per risolvere i problemi, ma sotto il cofano sono solo interfacce per il generatore di numeri casuali del sistema operativo nativo. All’epoca questa era una buona soluzione, ma il problema è che è lenta.

Ora con PHP 8.2 non solo otteniamo un generatore di numeri casuali completamente nuovo, ma è integrato in PHP e otteniamo un’interfaccia orientata agli oggetti estensibile.

Si tratta in realtà di due diverse RFC che sto raggruppando insieme. Dopo che il primo “Random Extension 5.x” è stato votato e approvato, si è scoperto che c’erano alcuni problemi con esso. Una seconda RFC, “Random Extension Improvement”, è stata preparata e votata per risolvere i problemi riscontrati con la prima.

Il risultato finale è un nuovo insieme di classi che ci danno numeri pseudo-casuali migliori in PHP.

Mentre stiamo effettivamente ottenendo diversi nuovi generatori di numeri casuali (RNG), per semplicità discuterò la nuova classe Random\Engine\Secure.

$engine = new Random\Engine\Secure();

$randomString = $engine->generate(); // a random binary string

echo bin2hex($randomString); 

Ora, se vogliamo fare qualcosa come ordinare un array, abbiamo bisogno di uno dei nuovi oggetti Randomizer.

$randomizer = new Random\Randomizer($engine);

$items = range(1, 10);

$randomizedItems = $randomizer->shuffleArray($items);

print_r($randomizedItems);

Nell’esempio sopra, abbiamo usato l’engine Secure. L’engine Secure non accetta un seme (seed) e genererà sempre una stringa non riproducibile. I motori che ti consentono di specificare un seme produrranno gli stessi risultati ogni volta se utilizzi lo stesso seme.

La classe Randomizer fornisce anche molti altri metodi che sono davvero ciò che gli sviluppatori PHP stanno cercando.

  • getInt() : int
    Questa rimpiazza la vecchia funzione mt_rand()
  • getInt(int $min, int $max) : int
    Questa rimpiazza la vecchia funzione mt_rand() e quella nuova random_int()
  • getBytes(int length): string
    Questa rimpiazza la funzione random_bytes() 
  • shuffleArray(array $array): array
    Questa rimpiazza la vecchia funzione shuffle_array()
  • shuffleString(string $string): string
    Questa rimpiazza la vecchia funzione str_shuffle()

Tra le altre cose, poiché questo porta tutte le funzionalità di randomizzazione in un’unica area del motore, snellisce il codice principale e renderà più semplici ulteriori miglioramenti.

Grazie di tutto e passiamo oltre

Tutte le cose buone hanno una fine e questo include alcune funzionalità e comandi di PHP. Diamo un’occhiata ad un paio di importanti deprecazioni che, se non stai attento, finiranno per causarti problemi.

Deprecazione delle proprietà dinamiche

A prima vista, questo sembra che sarà un grosso problema. Poiché PHP ha ottenuto il modello a oggetti corrente, è stato possibile aggiungere proprietà a un oggetto ogni volta che lo desideri. Ora qualcuno pensa che questo comportamento sia una cosa negativa. (SUGGERIMENTO: è sempre stata una brutta cosa, ma molti sviluppatori ne hanno approfittato.)

class MyClass {

    public string $name;

}

$myObj = new MyClass():

$myObj->nmae = ‘Cal Evans’;

Si noti che ho sbagliato a scrivere il nome della proprietà. So di essere probabilmente l’unico sviluppatore che ha sbagliato a scrivere il nome di una proprietà, ma in PHP quando succede, ottengo una nuova proprietà sull’oggetto e la proprietà originale rimane invariata. Non era mia intenzione.

A partire da PHP 8.2, questo emetterà un AVVISO DEPRECATO.

Ci sono 3 eccezioni a questa nuova regola.

  • Qualsiasi istanza di StdClass sarà comunque in grado di accettare proprietà dinamiche.
  • Qualsiasi classe con i metodi magic __get() e __set() accetterà comunque qualsiasi proprietà.
  • Qualsiasi classe con l’annotazione del compilatore #[AllowDynamicProperties] e qualsiasi classe figlia consentirà di impostare le proprietà dinamiche.

Quindi, sebbene non tutto sia perduto per coloro che dipendono da questa “caratteristica” di PHP, se lo utilizzerai ancora, dovrai apportare alcune modifiche al tuo codice.

La buona notizia è che tutto ciò che accadrà in questo momento è l’avviso emesso nei file di registro. Quindi, mentre potrebbe riempire i tuoi file di registro ricordandoti che devi risolvere questo problema, PHP 8.2 non interromperà il tuo codice. Ciò accadrà in PHP 9.0 quando l’avviso – e la possibilità di aggiungere automaticamente proprietà dinamiche – verrà rimosso da PHP.

(Parziale) Deprecazione dell’interpolazione di stringa ${}

Questo è un altro cambiamento che pensavo sarebbe stato un grosso problema. Si è scoperto che probabilmente non influenzerà molti sviluppatori.

Esistono 4 modi per implementare la sintassi “{$variableName}”, 2 che hanno senso e due che non lo hanno. Vediamoli insieme:

echo “$sensoDellaVita”;

Questa è di gran lunga la versione più comune dell’interpolazione di stringhe. Metti semplicemente la variabile in una stringa tra virgolette. Se stai facendo questo, sei a posto, e ci sono due modi.

echo “{sensoDellaVita}”;

echo “{$dogulasAdams->sensoDellaVita()}”;

L’ho sempre considerata “vecchia scuola”. Non lo facevo in questo modo da molto tempo. Funziona ancora, è pulito ed è facile da capire.

Questo è anche l’unico metodo che consente di utilizzare le proprietà e i metodi degli oggetti. Quindi, se vuoi usare l’interpolazione di stringhe con un oggetto, avrai bisogno di questo metodo.

echo “${sensoDellaVita}”;

Questo sopra invece sarà deprecato. Sì, fa la stessa cosa dei primi due, ma è un po’ più confuso perché $ è fuori dalle parentesi graffe.

$quarantaDue = 42;

$sensoDellaVita = ‘quarantaDue’;

echo “${sensoDellaVita}”;

Infine, abbiamo il modo in cui puoi usare “variabili” dall’interpolazione di stringhe. Questo è solo troppi livelli di indirizzamento. Nel codice sopra, alla fine arriviamo al punto in cui “echeggiamo” 42, ma prendiamo la strada più lunga.

A partire da PHP 8.2, le ultime due strutture emetteranno un AVVISO DI DEPRECAZIONE nei file di registro. In PHP 9.0, smetteranno del tutto di funzionare e causeranno l’arresto anomalo del programma (o lanceranno un errore che puoi intercettare, ma probabilmente non puoi recuperare).

Ricapitoliamo

Questa è la prima Release Candidate di PHP 8.2. Non giocarci su nessun sito in produzione. Se vuoi testarla con un sito esistente, imposta un nuovo sito per il test, clona il tuo sito di produzione in esso e gioca con quello. Quando hai finito, puoi semplicemente eliminarlo.

Mentre ti curi nel tuo nuovo ambiente di test, controlla i file di registro dopo ogni test. Assicurati che non ci siano errori e verifica se vengono visualizzati nuovi avvisi.

Se PHP 8.2 è qualcosa di simile a PHP 8.0 e PHP 8.1, non mi aspetto che il codice PHP moderno abbia problemi con esso. Per fortuna, i tecnici di SiteGround ti rendono incredibilmente facile testare le cose per assicurarti che il tuo sito possa funzionare il più velocemente possibile con PHP 8.2

A proposito di prestazioni, PHP 8.2 non è stato ancora adeguatamente valutato, ma ci aspettiamo che ogni versione di PHP sia un po’ più veloce delle versioni precedenti. Con le modifiche al sistema CSPRNG e altre cose come la rimozione del vecchio libmysql, è una scommessa sicura che questa versione sarà più veloce di PHP 8.1.

Mentre stai testando, clonando e osservando i risultati, assicurati di dedicare del tempo a twittare un enorme GRAZIE a tutte le persone che hanno reso possibile questa versione. Fai sentire il tuo affetto su twitter.com/@php_net

Cal Evans

PHP Evangelist

Una delle persone più amate della community PHP, ha dedicato oltre 16 anni allo sviluppo della straordinaria comunità PHP e al tutoring della nuova generazione di sviluppatori. Siamo estremamente onorati che sia anche un amico molto speciale di SiteGround.

Inizia la discussione

Sei pronto a iniziare?