PHP 8.2

Marcus Olsson,

Precis nyligen släpptes PHP 8.2 med en drös ändringar och nyheter. Precis som vanligt så skickar jag vidare till andra som förklarar bättre än mig själv – t.ex. Brent Roose, PHP Watch samt php.nets egna sammanfattning.

Men, det finns två nyheter som är värda att spana in – och en ändring som kommer (eller redan har) dela PHP-communityt i två delar.

Readonly classes

Sedan PHP 8.1 så kan man enkelt använda sig av properties som är readonly:

1<?php
2class Builder
3{
4 public function __construct(
5 public readonly ?string $string,
6 public readonly ?string $suffix,
7 ) {
8 //
9 }
10}
1<?php
2class Builder
3{
4 public function __construct(
5 public readonly ?string $string,
6 public readonly ?string $suffix,
7 ) {
8 //
9 }
10}

Men nu i.o.m. PHP 8.2, om alla klassens properties ändå är readonly kan man välja att definiera hela klassen som readonly:

1<?php
2readonly class Builder
3{
4 public function __construct(
5 public ?string $string,
6 public ?string $suffix,
7 ) {
8 //
9 }
10}
1<?php
2readonly class Builder
3{
4 public function __construct(
5 public ?string $string,
6 public ?string $suffix,
7 ) {
8 //
9 }
10}

Traits får konstanter

En märklige grej med PHP var tidigare att man inte kunde använda konstanter i en trait, men det är numera åtgärdat.

1<?php
2trait Filter {
3 public const STANDARD = 'standard';
4}
5 
6class Products
7{
8 use Filter;
9}
10 
11echo Products::STANDARD; // 'standard'
1<?php
2trait Filter {
3 public const STANDARD = 'standard';
4}
5 
6class Products
7{
8 use Filter;
9}
10 
11echo Products::STANDARD; // 'standard'

Observera att man fortfarande inte kan använda ens konstant inom trait:en, utan endast i klasser som implementerar dem.

Dynamic properties är numera deprekerade

Ojoj, detta är en vattendelare bland PHP-programmerare.

Ända sedan så länge som man kan minnas (sedan PHP blev OOP?) så har man enkelt kunna klistra på extra properties på en klass, tänk dig:

1<?php
2class Name {
3 public $firstName;
4 public $lastName;
5 
6 public function __construct(string $firstName, string $lastName) {
7 $this->firstName = $firstName;
8 $this->lastName = $lastName;
9 }
10}
11 
12$name = new Name('John', 'Doe');
13 
14echo $name->firstName; // "Marcus"
15 
16$name->middleName = 'Clark';
17 
18echo $name->middleName; // "Clark"
1<?php
2class Name {
3 public $firstName;
4 public $lastName;
5 
6 public function __construct(string $firstName, string $lastName) {
7 $this->firstName = $firstName;
8 $this->lastName = $lastName;
9 }
10}
11 
12$name = new Name('John', 'Doe');
13 
14echo $name->firstName; // "Marcus"
15 
16$name->middleName = 'Clark';
17 
18echo $name->middleName; // "Clark"

Alltså, fastän middleName inte finns som en definierad property på Name-classes så tillåts man både att sätta och läsa den. Men detta är snart ett minne blott.

I PHP 8.2 får man istället en Deprecated notice. Men, det finns tre undantag/alternativ:

Det första är att detta inte gäller klasser som använder sig av "magic methods" __set() och __get(). Det gäller inte heller klasser av typen stdClass, dessutom så finns den ett nytt attribut för att tala om att dynamiska properties ska vara tillåtna, AllowDynamicProperties:

1<?php
2#[\AllowDynamicProperties]
3class Name {
4 ///
5}
1<?php
2#[\AllowDynamicProperties]
3class Name {
4 ///
5}

Varför delar denna communityt såpass mycket? Egentligen handlar det om vad PHP ska vara för något språk, PHP har alltid varit väldigt förlåtande där man enkelt kan skriva koden för att passa en själv och sitt projekt. Å andra handen finns det dem som driver språket i en betydligt modernare och "säkrare" riktning för att skriva mer felsäker kod – detta är ett steg i den riktningen (tillsammans med en rad tillägg som har kommit till sedan PHP 8.0).

Redan vid omröstningen så var detta en het potatis, där "Ja"-sidan i slutändan vann med 52 mot 25.

Som vanligt lär det ta ett par veckor innan PHP 8.2 blir lite enklare att använda när paket och annat är uppdaterade för att stödja det. Dock så även denna gång är det i många fall förhoppningsvis inget jättejobb då 8.2 är relativt kompatibelt med 8.1 – förutsatt att man inte förlitar sig på dynamic properties d.v.s...

I.o.m. denna releasen så innebär det också att PHP 8.0 inte stöds längre (mer än med säkerhetspatcher), och PHP 8.1. blir den lägst stödda versionen.