PHP 8.1: le novità della nuova versione

Introduzione

PHP prosegue con il suo avanzamento attraverso versioni Minor con PHP 8.1 rilasciato a novembre 2021. Questa versione include caratteristiche significative, tra cui Enumerazioni, Fibers, e molto altro.

1. Enumerazioni (Enums)

Una delle caratteristiche più attese in PHP 8.1 sono le Enumerazioni (Enums). Gli Enums permettono di definire una serie di valori costanti e gestire variabili che possono contenere solo uno di questi valori, migliorando la robustezza del codice.

Il tipo enum è rappresentato internamente come una classe.
Le enumerazioni sono oggetti e hanno: una proprietà ‘name’ che è il nome enumerazione.
Le enumerazioni possono essere associate ad uno scalare es una stringa ad esempio allo scopo di essere salvata in un database.
Le enumerazioni associate a uno scalare es una stringa hanno anche la proprietà ‘value’


enum Status: string {
    case Active = 'active';
    case Inactive = 'inactive';
    case Archived = 'archived';
}

function setStatus(Status $status) {
    // Gestisce lo stato
}
setStatus(Status::Active);
setStatus(Status::Inactive);

echo Status::Active->name; // prints "Active"
echo Status::Active->value; // prints "active"

2. Fibers

Le Fibers sono un’implementazione di primitive di concorrenza. Esse sono di aiuto per la programmazione asincrona in PHP. Consentono tra l’altro di semplificare il codice delle Promise o le coroutine di Generator, e la sospensione e la ripresa di funzioni asincrone.


$fiber = new Fiber(function(): void {
    echo "Fiber in esecuzione";
    Fiber::suspend();
    echo "Fiber ripreso";
});

$fiber->start();
echo "Codice principale";
$fiber->resume();


$response = $httpClient->request('https://example.com/');
print json_decode($response->getBody()->buffer())['code'];

3. Intersezione dei Tipi (Intersection Types)

Gli Intersection Types permettono di richiedere che un parametro appartenga a più di un tipo allo stesso tempo. È particolarmente utile quando si lavora con interfacce.


function processData(A & B $data) {
    // Funzione che richiede oggetti che implementano sia A che B
}

4. Readonly Properties

Le proprietà di sola lettura non possono essere modificate dopo l’inizializzazione, ovvero dopo che è stato loro assegnato un valore.


class User {
public readonly string $username;
public function __construct(string $username) {
$this->username = $username;
}
}
$user = new User("Biagio");
// $user->username = "NuovoNome"; // Questo genererebbe un errore

4. Array is_list

La nuova funzione array_is_list consente di verificare se un array è una lista, cioè se ha chiavi sequenziali partendo da 0.


$result = array_is_list(['a', 'b', 'c']); // true

5. Performance Improvements

PHP 8.1 introduce vari miglioramenti di performance, inclusi quelli per le opcache e la gestione della memoria. Questo rende PHP 8.1 ancora più veloce e reattivo, specialmente per applicazioni su larga scala.

Conclusione

PHP 8.1 continua a potenziare il linguaggio, offrendo miglioramenti sia nelle funzionalità che nelle performance. Le nuove funzioni come Enums e Fibers aprono nuove strade per lo sviluppo in PHP, permettendo di scrivere codice più robusto e flessibile.

Riferimenti Utili

PHP 8.3: le novità della nuova versione

Introduzione

Le versioni Minor di PHP, come PHP 8.3, introducono miglioramenti e funzionalità.

1. Aggiunta dei Typed Class Constants

PHP 8.3 introduce i Typed Class Constants, permettendo ai programmatori di dichiarare costanti di classe tipizzate.


class Example {
    public const string NAME = 'Esempio';
}



interface I {
    const string PHP = 'PHP 8.1';
}

class Bar83 implements I {
    const string PHP = 'PHP 8.3';
}
echo 'Bar83::PHP: ' . Bar83::PHP; //print 'PHP 8.3'

class FooPHPArr implements I {
    const string PHP = []; // Fatal error: Cannot use array as value for class constant FooPHPArr::PHP of type string
}

2. Attributo #[\Override]

Con l’aggiunta dell’attributo #[\Override] a un metodo, PHP si assicura che esista un metodo con lo stesso nome in una classe genitore o in un’interfaccia implementata. Questa funzionalità rende sia piu leggibile il codice che semplificato il refactoring in quanto verrà rilevata la rimozione o il rename di un metodo sovrascritto.


//classe padre
class TestCase {

    protected function setUp(): void {
    }

    protected function tearDown(): void {
    }
}

/*

PHP < 8.3

final class MyTest extends TestCase {
    protected $logFile;

    protected function setUp(): void {
        $this->logFile = fopen('/tmp/logfile', 'w');
    }

    protected function taerDown(): void {
        fclose($this->logFile);
        unlink('/tmp/logfile');
    }
}

// The log file will never be removed, because the
// method name was mistyped (taerDown vs tearDown).

*/

//PHP 8.3

final class MyTest extends TestCase {
    protected $logFile;

    #[\Override]
    protected function setUp(): void {
        $this->logFile = fopen('/tmp/logfile', 'w');
    }

    #[\Override]
    //protected function taerDown(): void {
    protected function tearDown(): void {
        fclose($this->logFile);
        unlink('/tmp/logfile');
    }
}
// PHP Fatal error:  MyTest::taerDown() has #[\Override] attribute, but no matching parent method exists

3. funzione json_validate()

la funzione json_validate() verifica se una stringa è un JSON valido.



var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true


4. nuovi metodi di Randomizer

La Random Extension introdotta nelle versioni precedentei, con PHP 8.3 viene arricchita di nuovi metodi.

Il metodo getBytesFromString restituisce una sringa causale di caratteri estratti dalla stringa di caratteri passata come argomento.


$randomizer = new \Random\Randomizer();
printf(
    "%s.example.com",
    $randomizer->getBytesFromString('abcdefghijklmnopqrstuvwxyz0123456789', 16)
);
output something similar to:
3zsw04eiubcf82jd.example.com

Il metodo getFloat(float $min, float $max, Random\IntervalBoundary $boundary = Random\IntervalBoundary::ClosedOpen): float
restituisce un numero float casuale, quanto piu possibile uniformemente distribuito dall intervallo ($min, $max).


Generate a random latitude and longitude:
$randomizer = new \Random\Randomizer();
// Note that the latitude granularity is double the
// longitude's granularity.
//
// For the latitude the value may be both -90 and 90.
// For the longitude the value may be 180, but not -180, because
// -180 and 180 refer to the same longitude. ???
var_dump(sprintf(
    "Lat: %+.6f Lng: %+.6f",
    $randomizer->getFloat(-90, 90, \Random\IntervalBoundary::ClosedClosed),
    $randomizer->getFloat(-180, 180, \Random\IntervalBoundary::OpenClosed),
)); // string(32) "Lat: -51.742529 Lng: +135.396328"



Il metodo nextFloat(): float
restituisce un numero float casuale, quanto piu possibile uniformemente distribuito dall’intervallo semiaperto [0, 1).


$r = new \Random\Randomizer();
print $r->nextFloat();

Riferimenti Utili

Processo di Evoluzione e Sviluppo di PHP

Il processo di evoluzione e sviluppo di un linguaggio di programmazione, come PHP, è complesso e coinvolge molte fasi. Di seguito, esploreremo ogni fase con esempi concreti.

1. Definizione degli obiettivi e roadmap

PHP nacque negli anni ’90, inizialmente come linguaggio per generare pagine web dinamiche. Con l’avanzare delle necessità di sviluppo, PHP si è evoluto per gestire applicazioni più complesse, migliorando le sue prestazioni e la sicurezza. Ogni nuova versione risponde a obiettivi specifici, come le performance di PHP 7, che ha notevolmente aumentato la velocità rispetto a PHP 5.

2. Community di sviluppatori e governance

PHP è un progetto open-source, e la community è fondamentale per il suo sviluppo. Le decisioni vengono prese attraverso mailing list pubbliche (PHP Internals) e tramite il contributo di membri come il PHP-FIG (PHP Framework Interoperability Group). Il PHP-FIG ha introdotto standard come le PHP Standards Recommendations (PSR) per migliorare l’interoperabilità.

3. Proposte di cambiamento e revisione delle RFC

Nuove funzionalità passano attraverso un processo chiamato Request for Comments (RFC). Ad esempio, per introdurre il supporto ai tipi dichiarati (introdotti in PHP 7), venne creata una RFC che spiegava le motivazioni e gli esempi d’uso. Dopo il voto favorevole della community, questa modifica venne implementata nella versione finale.

4. Fasi di implementazione e testing

Una volta approvate, le funzionalità vengono implementate e testate. Ad esempio, per PHP 8 sono stati usati test automatici per introdurre Just-in-Time Compilation (JIT), una funzione che migliora le prestazioni per calcoli complessi.

5. Versioni stabili e supporto

PHP segue un ciclo di rilascio regolare, con versioni principali ogni due anni. Ogni versione è supportata per circa tre anni. Ecco una tabella con le principali versioni di PHP e le rispettive date di rilascio:

Versione Data di Rilascio Caratteristiche Principali
PHP 5.0 13 luglio 2004 Supporto OOP (Object-Oriented Programming)
PHP 5.3 30 giugno 2009 Namespaces, anonime closures
PHP 5.6 28 agosto 2014 Variadic functions, operatori null coalescing
PHP 7.0 3 dicembre 2015 Miglioramento delle prestazioni, tipi scalari
PHP 7.4 28 novembre 2019 Typed Properties, Arrow Functions
PHP 8.0 26 novembre 2020 JIT, Named Arguments, Union Types
PHP 8.1 25 novembre 2021 Enumerazioni, Fibers
PHP 8.2 8 dicembre 2022 Readonly properties, Deprecation di dynamic properties

6. Feedback continuo e miglioramento

Il feedback della community è essenziale. Gli sviluppatori segnalano errori e propongono miglioramenti tramite piattaforme come PHP Bug Tracking e GitHub. Questo feedback contribuisce a un’evoluzione costante del linguaggio.

Conclusioni

Il processo di sviluppo di PHP si basa sulla collaborazione tra una community mondiale di sviluppatori e un solido processo di governance. Per rimanere aggiornati, è possibile fare riferimento alle seguenti risorse ufficiali: