PHP 8.3: Le Novità e le Modifiche dell’Ultima Versione

Schermata codice PHP 8.3 e novità.
Tempo di Lettura: 8 minuti

Tabella dei Contenuti

PHP 8.3, rilasciato il 23 novembre, ha introdotto notevoli novità e miglioramenti rispetto alla sua versione precedente, PHP 8.2. Questa versione, pur essendo considerata “minore”, porta con sé cambiamenti significativi che possono impattare notevolmente sullo sviluppo PHP. Scopriamo insieme le principali novità e gli aggiornamenti di PHP 8.3.

Nuove Funzionalità e Miglioramenti in PHP 8.3 PHP 8.3 ha introdotto diverse nuove funzionalità e miglioramenti:

Costanti di Classe Tipizzate in PHP 8.3: Una Rivoluzione nella Programmazione

PHP 8.3 introduce una funzionalità rivoluzionaria: la tipizzazione delle costanti di classe. Sebbene PHP avesse introdotto la tipizzazione per le proprietà di classe già con PHP 7.4, questa innovazione non si era ancora estesa alle costanti. Fino ad ora.

La nuova versione estende la tipizzazione alle costanti di classe, includendo anche quelle in interfacce, trait ed enum. Questa modifica ha l’importante vantaggio di minimizzare il rischio che gli sviluppatori si discostino dall’intento originale di una costante, garantendo maggiore chiarezza e sicurezza nel codice.

Per illustrare, ecco un esempio pratico:

// Corretto:
interface ConstTest {
const string VERSION = "PHP 8.3"; // Tipo e valore sono entrambi stringhe
}

// Errato:
interface ConstTest {
const float VERSION = "PHP 8.3"; // Mancata corrispondenza tra tipo e valore
}

L’efficacia delle costanti di classe tipizzate diventa evidente quando si lavora con classi derivate. Nelle versioni precedenti, una sotto-classe poteva cambiare il valore di una costante, ma con PHP 8.3, ora è possibile prevenire cambiamenti accidentali del tipo di una costante, preservando la coerenza con la dichiarazione originale.

Ad esempio:

class ConstTest {
const string VERSION = "PHP 8.2";
}

class MyConstTest extends ConstTest {
// Corretto: cambiare il valore di VERSION è permesso
const string VERSION = "PHP 8.3";

// Errato: il tipo deve essere dichiarato come nella classe base
const VERSION = "PHP 8.3";

// Errato: non è possibile cambiare il tipo dichiarato nella classe base
const float VERSION = 8.3;
}

Da notare che è possibile “restringere” il tipo di una costante di classe in una sottoclasse, utilizzando un tipo compatibile o più specifico:

class ConstTest {
const string|float VERSION = "PHP 8.2";
}

class MyConstTest extends ConstTest {
// Corretto: è possibile specificare il tipo come stringa o float
const string VERSION = "PHP 8.3";
const float VERSION = 8.3;

// Corretto: anche se il valore potrebbe essere un int, è compatibile con float
const float VERSION = 8;

// Errato: non è possibile ampliare le opzioni di tipo includendo int
const string|float|int VERSION = 8;
}

Tuttavia, è importante sottolineare che due tipi, void e never, ampiamente utilizzati per le proprietà e

i valori di ritorno, non sono attualmente supportati come tipi per le costanti di classe in PHP 8.3.

In sintesi, la tipizzazione delle costanti di classe in PHP 8.3 rappresenta un salto di qualità nello sviluppo software. Fornisce ai programmatori uno strumento aggiuntivo per garantire che il codice sia non solo funzionale, ma anche preciso e fedele alle intenzioni originali, riducendo errori e migliorando la leggibilità e la manutenibilità del codice. Questa novità segna un’ulteriore evoluzione della tipizzazione in PHP, consolidando la sua posizione come linguaggio di programmazione moderno e robusto.

Nuova Funzione in PHP 8.3: json_validate()

La manipolazione di dati codificati in JSON è una pratica comune nello sviluppo web. In PHP 8.3, una nuova funzione, json_validate(), è stata introdotta per migliorare significativamente questo processo. Questa funzione risulta particolarmente utile per verificare la validità sintattica di un payload JSON prima di procedere con il suo utilizzo.

Nelle versioni precedenti di PHP, gli sviluppatori si affidavano alla funzione json_decode() per controllare gli errori durante la conversione dei dati JSON in array associativi o oggetti. Tuttavia, questo metodo richiedeva l’uso di risorse significative per costruire le strutture di array o oggetti, anche quando il solo scopo era la verifica dell’integrità del JSON.

Ecco un esempio di come veniva utilizzata la json_decode() per convalidare un payload JSON:

$obj = json_decode($maybeJSON);

if (json_last_error() === JSON_ERROR_NONE) {
// Esecuzione di operazioni con $obj
}

In questo scenario, le risorse venivano impiegate principalmente per stabilire la validità del payload JSON, una pratica poco efficiente in termini di utilizzo della memoria.

Con l’arrivo di PHP 8.3, è possibile eseguire la stessa operazione in modo più efficiente utilizzando json_validate():

if (json_validate($maybeJSON)) {
// Esecuzione di operazioni con $maybeJSON
}

Importante: È bene ricordare che non è ottimale utilizzare json_validate() e successivamente passare i dati attraverso json_decode(), in quanto ciò impiegherebbe comunque le risorse di memoria per la decodifica. L’approccio ideale è utilizzare json_validate() per confermare la validità del JSON prima di procedere con ulteriori operazioni, come il salvataggio del dato o la sua trasmissione come risposta a una richiesta. In questo modo, si ottimizza l’uso delle risorse e si garantisce un trattamento più efficiente dei dati JSON.

Deep Cloning di Proprietà Readonly in PHP 8.3

PHP 8.3 ha introdotto un miglioramento significativo nella gestione delle proprietà readonly nelle classi. Questa funzionalità, inizialmente introdotta in PHP 8.1 per singole proprietà e poi estesa a intere classi in PHP 8.2, ha ricevuto un ulteriore sviluppo grazie a una recente RFC (Request For Comments).

Il problema affrontato era la rigidità nell’utilizzo di classi con proprietà readonly, che limitava alcune possibilità di programmazione. La RFC ha proposto due soluzioni principali:

  1. Permettere l’estensione di classi non-readonly da classi readonly.
  2. Consentire la reinizializzazione di proprietà readonly durante la clonazione.

La seconda proposta, adottata in PHP 8.3, ha apportato una svolta nella gestione delle proprietà readonly. Questa nuova funzionalità permette che, durante il deep cloning, le istanze di una classe con proprietà readonly possano essere reinizializzate all’interno del metodo magico __clone. Ciò significa che anche le funzioni invocate da __clone possono legalmente modificare queste proprietà.

Ecco un esempio pratico tratto dalla RFC che illustra il nuovo comportamento:

class Foo {
public function __construct(
public readonly DateTime $bar,
public readonly DateTime $baz
) {}

public function __clone() {
// Durante la clonazione, $bar riceverà un nuovo oggetto DateTime
$this->bar = clone $this->bar;

// Questa funzione verrà chiamata
$this->cloneBaz();
}

private function cloneBaz() {
// Questa operazione è lecita quando chiamata all'interno di __clone
unset($this->baz);
}
}

$foo = new Foo(new DateTime(), new DateTime());
$foo2 = clone $foo;

Questa novità aumenta significativamente la flessibilità nell’utilizzo di classi con proprietà readonly, permettendo di utilizzare pattern di progettazione più avanzati e sofisticati, pur mantenendo l’integrità e la sicurezza che le proprietà readonly offrono.

Introduzione al Nuovo Attributo #[\Override] in PHP 8.3

PHP 8.3 ha introdotto un’importante novità che migliora significativamente la chiarezza e la precisione del codice: l’attributo #[\Override]. Questo nuovo attributo è fondamentale quando si lavora con l’ereditarietà e le interfacce in PHP, in quanto fornisce una conferma esplicita che un metodo in una classe figlia è destinato a sovrascrivere un metodo nella classe genitore o a implementare un metodo definito in un’interfaccia.

Il Problema Risolto da #[\Override]: Nella programmazione, può capitare che un metodo in una classe derivata sia scritto con l’intento di sovrascrivere un metodo della classe genitore o di implementare un metodo di un’interfaccia. Tuttavia, errori come refusi nel nome del metodo possono far sì che il metodo non sovrascriva effettivamente quello previsto, portando a comportamenti imprevisti e difficili da individuare.

Come Funziona #[\Override]: L’attributo #[\Override] serve a garantire che il metodo in una classe derivata sia effettivamente una sovrascrittura di un metodo della classe genitore o un’implementazione di un metodo di un’interfaccia. Se un metodo contrassegnato con #[\Override] non corrisponde a un metodo nella classe genitore o nell’interfaccia, PHP genererà un errore, rendendo immediatamente evidente il problema.

Esempio Pratico:

class A {
protected function ovrTest(): void {}
}

class B extends A {
#[\Override]
public function ovrTest(): void {} // Corretto: sovrascrive ovrTest() di A
}

class C extends A {
#[\Override]
public function ovrBest(): void {} // Errore: ovrBest() non esiste in A
}

Recupero Dinamico di Costanti di Classe e Membri di Enum

PHP 8.3 ha semplificato anche il recupero dinamico di costanti di classe e membri di enum. In precedenza, per ottenere il valore di una costante di classe o di un membro di enum usando una variabile per il nome, si doveva usare la funzione constant(). Questo metodo era meno diretto e poteva risultare più complesso in alcuni scenari.

Ora, con PHP 8.3, è possibile accedere direttamente a queste costanti e membri usando una sintassi più semplice e diretta:

class MyClass {
public const THE_CONST = 9;
}

enum MyEnum: int {
case FirstMember = 9;
case SecondMember = 9;
}

$constantName = 'THE_CONST';
$memberName = 'FirstMember';

echo MyClass::{$constantName}; // Accesso diretto alla costante di classe
echo MyEnum::{$memberName}->value; // Accesso diretto al membro di enum

Queste innovazioni in PHP 8.3, sia l’attributo #[\Override] sia il miglioramento nel recupero dinamico delle costanti, rappresentano passi importanti verso un codice più chiaro, sicuro e mantenibile.

PHP 8.3 ha introdotto un metodo innovativo e utile per la generazione di stringhe casuali: getBytesFromString(). Questo metodo, aggiunto all’estensione Random di PHP, semplifica notevolmente la creazione di stringhe randomizzate da un set di caratteri predefiniti.

Come Funziona getBytesFromString(): La funzionalità è piuttosto diretta. Fornite una stringa di caratteri da cui attingere e specificate la lunghezza desiderata per la stringa casuale. Il metodo getBytesFromString() si occuperà poi di selezionare casualmente i byte dalla vostra stringa di partenza, fino a raggiungere la lunghezza specificata.

Esempi Pratici:

$rando = new Random\Randomizer();
$alpha = 'ABCDEFGHJKMNPQRSTVWXYZ';

// Genera una stringa casuale di 6 caratteri da $alpha
echo $rando->getBytesFromString($alpha, 6); // Es: "MBXGWL"

Un aspetto interessante di getBytesFromString() è che permette di generare stringhe casuali più lunghe della stringa di input. Ad esempio:

$rando = new Random\Randomizer();
$nums = '123456';

// Genera una stringa casuale di 10 cifre da $nums
echo $rando->getBytesFromString($nums, 10); // Es: "2526341615".

Ponderazione dei Caratteri nell’Input: Un’altra caratteristica distintiva di questo metodo è la possibilità di “pesare” i caratteri nell’input. Se alcuni caratteri compaiono più frequentemente nella stringa di input, avranno maggiori probabilità di essere selezionati nella stringa casuale. Per esempio:

$rando = new Random\Randomizer();
$weighted = 'AAAAA12345';

// Genera una stringa casuale dove 'A' ha maggiori probabilità di apparire
echo $rando->getBytesFromString($weighted, 5); // Es: "1AA53"

In conclusione, il metodo getBytesFromString() in PHP 8.3 offre una soluzione semplice ed efficace per la generazione di stringhe casuali, con la flessibilità di personalizzare la distribuzione dei caratteri e la lunghezza della stringa risultante. Questo lo rende uno strumento prezioso per una varietà di applicazioni, dall’elaborazione di dati alla sicurezza informatica.

Altri Cambiamenti e Miglioramenti in PHP 8.3

Oltre alle importanti novità già discusse, PHP 8.3 introduce una serie di miglioramenti e funzionalità aggiuntive che arricchiscono ulteriormente il linguaggio. Di seguito, evidenziamo alcuni di questi aggiornamenti minori, che nonostante la loro scala ridotta, possono avere un impatto significativo nello sviluppo quotidiano.

  1. Nuovi Metodi per la Classe DOMElement: PHP 8.3 arricchisce la gestione del DOM con metodi aggiuntivi come DOMElement::getAttributeNames(), DOMElement::insertAdjacentElement(), DOMElement::insertAdjacentText(), e altri, migliorando la manipolazione dei nodi DOM.
  2. Aggiornamenti per IntlCalendar: La classe IntlCalendar è stata estesa con metodi come IntlCalendar::setDate() e IntlCalendar::setDateTime(), offrendo maggior flessibilità nella gestione delle date.
  3. Funzioni LDAP Aggiornate: Le nuove funzioni ldap_connect_wallet() e ldap_exop_sync() ampliano le capacità di integrazione LDAP.
  4. Miglioramenti nelle Funzioni Multibyte: La nuova funzione mb_str_pad() aggiunge ulteriori opzioni per la manipolazione di stringhe multibyte.
  5. Nuove Funzioni POSIX: Funzioni come posix_sysconf() e posix_eaccess() sono state introdotte per migliorare l’interazione con il sistema operativo.
  6. Nuovo Metodo in ReflectionMethod: Il metodo ReflectionMethod::createFromMethodName() offre maggiore flessibilità nella riflessione dei metodi.
  7. Funzioni Socket Aggiornate: La funzione socket_atmark() amplia le funzionalità di networking.
  8. Nuove Funzioni per le Stringhe: str_increment(), str_decrement(), e estream_context_set_options() sono alcune delle nuove funzioni introdotte per la manipolazione delle stringhe.
  9. Nuovo Metodo in ZipArchive: ZipArchive::getArchiveFlag() aggiunge nuove possibilità di gestione degli archivi ZIP.
  10. Nuova Impostazione INI: La zend.max_allowed_stack_size permette di configurare la dimensione massima dello stack, migliorando la gestione delle risorse.

Deprecazioni in PHP 8.3

Ogni nuova versione di PHP porta con sé anche un elenco di funzioni e impostazioni che vengono deprecate. Queste deprecazioni sono importanti da notare, in quanto l’uso continuato di tali funzioni può portare a warning nei log e potenziali problemi di compatibilità.

Tra le deprecazioni in PHP 8.3 troviamo:

  • La correzione della costante U_MULTIPLE_DECIMAL_SEPERATORS in U_MULTIPLE_DECIMAL_SEPARATORS.
  • La deprecazione della variante 3MT_RAND_PHP Mt19937.
  • Cambiamenti nella ReflectionClass::getStaticProperties().
  • Diverse impostazioni INI come assert.active, assert.bail, ecc., sono state deprecate.
  • Le chiamate senza argomenti a get_class() e get_parent_class() sono ora deprecate.

PHP 8.3 Disponibile su G Tech Group

In conclusione, PHP 8.3 rappresenta un significativo passo avanti nello sviluppo del linguaggio, introducendo una serie di nuove funzionalità, miglioramenti e deprecazioni che sono cruciali per modernizzare e ottimizzare il codice PHP. Con l’aggiunta di metodi più avanzati, una maggiore flessibilità e l’introduzione di nuove funzioni, PHP 8.3 si posiziona come una scelta eccellente per gli sviluppatori che cercano di migliorare le prestazioni e la sicurezza delle loro applicazioni.

Per coloro che utilizzano i servizi di hosting e server, abbiamo una buona notizia: G Tech Group ha già implementato PHP 8.3 su tutti i suoi sistemi di hosting e server. Questo significa che, come cliente di G Tech Group, potete godere immediatamente di tutti i benefici offerti dalla più recente versione di PHP, senza la necessità di aggiornamenti manuali o configurazioni complesse.

Questa implementazione è parte dell’impegno di G Tech Group nel fornire le tecnologie più avanzate e aggiornate ai suoi clienti, assicurando che i vostri progetti siano sempre supportati dalle migliori e più recenti soluzioni disponibili sul mercato. Con PHP 8.3 su G Tech Group, potete aspettarvi un ambiente di hosting robusto, sicuro e performante, ideale per sviluppare e far crescere le vostre applicazioni web.

Lascia un commento

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

G Tech Group nasce nel concettualmente nel 2011 e imprenditorialmente nel 2013 da un’idea di Gianluca Gentile il suo fondatore.

Lo scopo era quello di creare la prima Social Web Agency non una classica agenzia web che si occupa di social ma un’aggenzia che mettesse in condivisione le proprie risorse e idee con altre agenzie mettendo anche in comunicazione diverse agenzie creando una vera e propria rete.

Post Recenti