PHP 8.2 on nyt julkistettu virallisesti

Zone Blogi
Jaa:

Tarkkaavainen blogimme lukija tietää, että Zonessa on ollut mahdollista testata PHP:n uusinta versiota 8.2 jonkin aikaa sen betaversion julkaisun jälkeen. 8. joulukuuta PHP 8.2 on jättänyt julkaisuehdokkaan statuksen ja se on julkistettu virallisesti. Tämän julkaisun myötä on otettu taas iso askel PHP scriptikielen kehityksessä. Jäljempänä keskitymmekin tärkeimpiin muutoksiin.

PHP 8.2 on nyt julkistettu virallisesti

Read only -luokat

Jos versiosta 8.1 lähtien luokan property voitiin asettaa vain luku -muotoiseksi, niin nyt se voidaan tehdä globaalisti koko luokalle.

Aiemmin:

class Person
{
    public readonly string $name;

    public readonly int $age;

    public function __construct(string $name, int $age)
    {
        $this->age = $age;
        $this->name = $name;
    }
}

Versiosta 8.2 alkaen:

readonly class Person
{
    public string $name;

    public int $age;

    public function __construct(string $name, int $age)
    {
        $this->age = $age;
        $this->name = $name;
    }
} 

DNF (Disjunctive Normal Form) -tyypit

On huomionarvoista, että PHP-tyyppijärjestelmä on kehittynyt erittäin nopeasti uusimpien versioiden myötä. Aiemmin lisättyjen union– eli yhteistyyppien lisäksi tyyppejä voidaan nyt linkittää ehtoihin. Kun aiemmin ei ollut mahdollista määrittää syötteeksi esimerkiksi, että muuttujan tulee implementoida useita interfeissejä, niin nyt se on tehty mahdolliseksi. Tietenkin se tapahtuu nyt myös kaikkien tyyppien kanssa.

class Race { 
    public function register((Car&OffRoad)|null $vehicle)
    {
        //... 
    } 
} 

null, false ja true erillisenä tyyppinä

Lisäksi PHP-kehittäjät täydensivät olemassa olevaa tyyppijärjestelmää poikkeuksilla, jotka itse asiassa määräävät arvon.

class MyValue
{
    public function iAmFalse(): false {/**/}

    public function iAmTrue(): true {/**/}

    public function iAmNull(): null {/**/}
}

Vakiot trait’eissa

Versiosta 8.2 alkaen vakioita voi käyttää myös traitien sisällä. Niitä saa kuitenkin käyttää vain sellaisessa luokassa, joka käyttää traitia ja vain luokan omalla nimellä.

trait Something {
    public const SOMEVALUE = 1;
} 

class Someone {
    use Something;
} 

var_dump(Someone::SOMEVALUE) // 1

Dynaamisten ominaisuuksien deprekointi eli toiminnallisuuksien karsiminen

Lisäksi versiosta 8.2 lähtien virheiden ja bugien välttämiseksi on deprekoitu dynaamiset ominaisuudet. Poikkeuksena on sisään rakennettu luokka stdClass. Tämä muutos ei vaikuta __get ja __set -maagisiin menetelmiin. Tämä voidaan nyt myös ohittaa asettamalla luokalle ominaisuus #\AllowDynamicProperties], joka on samoin lisätty uudessa versiossa.

Huomiota voidaan kiinnittää myös siihen, että suunnitelmien mukaan dynaamiset ominaisuudet eivät enää ole sallittuja PHP:n versiosta 9.0 alkaen.

Aiemmin:

class Vehicle
{
    public $ction;
}

$vehicle = new Vehicle();
$vehicle->action = 'Drive';

Versiosta 8.2 alkaen:


class Vehicle
{
    public $ction;
}

$vehicle = new Vehicle();
$vehicle->action = 'Drive';  // NOTICE

$vehicle = new stdClass();
$vehicle->last_name = 'Drive'; // sallittu

#[\AllowDynamicProperties]
class Vehicle
{
    public $ction;
}

$vehicle = new Vehicle();
$vehicle->action = 'Drive';  // myös sallittu

SensitiveParameter -määrite

Lisätty on myös kauan kaivattu SensitiveParameter -määrite, joka antaa mahdollisuuden piilottaa exceptionien tracesta arvot, joita ei pitäisi tallentaa mihinkään. Tämä sulkee pois tilanteen, jossa itse salasanat ja tokenit on hajautettu, mutta ne vuotavat silti tekstimuotoisina esimerkiksi lokeihin.

function doSomeQueryWithSecret (
    #[\SensitiveParameter]
    string $password,
    string $username
){
    throw new Exception('Error!'); 
}

Kun aiemmin $password-arvo ei ollut tracessa piilotettu, niin nyt se korvataan arvolla object(SensitiveParameterValue).

try {
    doSomeQueryWithSecret('iamreallysecret', 'iamnot')
} catch (Exception $e) {
    echo $e;
} 

/*
Stack trace:
#0 example.php(19): doSomeQueryWithSecret('iamreallysecret', 'iamnot')
#1 {main}
*/

// SensitiveParameter atribuudi korral

/*
Stack trace:
#0 example.php(19): doSomeQueryWithSecret(object(SensitiveParameterValue), 'iamnot')
#1 {main}
*/

Lisättyjä ja karsittuja ominaisuuksia on uudessa versiossa runsaasti. Tarkempi katsaus kaikkiin muutoksiin löytyy PHP:n virallisilta verkkosivuilta.

Muistutamme myös eräästä tärkeästä Zone-palveluihin liittyvästä ominaisuudesta: jos haluat ottaa heti käyttöön PHP 8.2:n, voit ensin testata sivustosi toimivuutta uudella versiolla selaimessasi ilman, että sinun tarvitsee muuttaa palvelinasetuksia. Kerroimme siitä myös aikaisemmassa blogipostituksessa Vähemmän päänsärkyä uusilla PHP-versioilla.

Suositut postaukset

.EU-verkkotunnuksen ale päättyy! Käytä tilaisuutta ja rekisteröi yhden euron domain vielä tänään

Zone Blogi
Viime vuonna alkanut .EU-verkkotunnusten alennusmyynti saavuttaa loppunsa tammikuun lopussa. Tämän vuoksi suosittelemme kaikille hyödyntämään vielä...

Verkkosivuston muutosten automaattinen julkaiseminen Github Actionsin kautta

Krista Veske
Kuten monet muutkin ammattikehittäjät, myös minä tunnen välillä, että pelkkä töissä kirjoitettu koodi ei riitä, joten koodaan joskus myös työn...

Odottamaton uhka yksityisyydelle ja vapaudelle internetissä

Ardi Jürgens
Valitettavasti poliitikot ja byrokraatit ovat kuin suljettujen ovien takana sopineet, että kyseinen asetuksen ansiosta jokainen EU-maa voi sijoittaa selaimiin...

Hyvä asiakastuki on menestyksen avain, eli haloo, miksi et vastaa?

Martti Varik
Miten suuri pettymys voi olla, jos tarvitset pikaisesti työmiestä tai rakentajaa, ja lähetät sähköpostitiedustelun kahdeksalle ammattilaiselle, mutta...