PHP 8.4

Marcus Olsson,

PHP 8.4 (eller t.o.m. 8.4.1) är nu ute med ett par fantastiska nyheter. Har inte möjlighet att gå igenom allt här (spana in officiella php.net och t.ex. stitcher.io för mer övergripande nyheter) – men två saker som är väldigt värda att belysa:

"Without parentheses"

PHP har alltid varit märkligt med att man måste wrappa new när man ska kalla på en metod efter att ha instansierat ett objekt:

1$results = (new Calculator())->calculate();
1$results = (new Calculator())->calculate();

Jag har stött på andra PHP-utvecklare som inte ens har känt till detta syntax utan verkar ha "lärt" sig att new Calculator()->calculate() inte funkar som i andra programmeringsspråk och helt enkelt kört den långa vägen istället (vilket såklart fortfarande kan vara mer passande och läsbart):

1$calculator = new Calculator();
2$results = $results->calculate();
1$calculator = new Calculator();
2$results = $results->calculate();

Men nu i.o.m. PHP 8.4. kan man helt enkelt använda sig av:

1$results = new Calculator()->calculate();
1$results = new Calculator()->calculate();

Property hooks

Property hooks funkar lite som accessors/"custom attributes" i Laravel (gissningsvis kommer de använda property hooks "natively" i framtiden), där vi nu inte längre kommer att behöva skriva separata "getters" och "setters" – utan där vi kan definiera dem direkt för attributen. Exempel (saxat ifrån php.net):

1class Person
2{
3 // A "virtual" property. It may not be set explicitly.
4 public string $fullName {
5 get => $this->firstName . ' ' . $this->lastName;
6 }
7 
8 // All write operations go through this hook, and the result is what is written.
9 // Read access happens normally.
10 public string $firstName {
11 set => ucfirst(strtolower($value));
12 }
13 
14 // All write operations go through this hook, which has to write to the backing value itself.
15 // Read access happens normally.
16 public string $lastName {
17 set {
18 if (strlen($value) < 2) {
19 throw new \InvalidArgumentException('Too short');
20 }
21 $this->lastName = $value;
22 }
23 }
24}
1class Person
2{
3 // A "virtual" property. It may not be set explicitly.
4 public string $fullName {
5 get => $this->firstName . ' ' . $this->lastName;
6 }
7 
8 // All write operations go through this hook, and the result is what is written.
9 // Read access happens normally.
10 public string $firstName {
11 set => ucfirst(strtolower($value));
12 }
13 
14 // All write operations go through this hook, which has to write to the backing value itself.
15 // Read access happens normally.
16 public string $lastName {
17 set {
18 if (strlen($value) < 2) {
19 throw new \InvalidArgumentException('Too short');
20 }
21 $this->lastName = $value;
22 }
23 }
24}

Lägg där till en rad nya array-funktioner som array_find och array_any/array_all samt nya mb_-funktioner (mb_ucfirst och mb_lcfirst äntligen!) så är PHP 8.4 en riktigt fullpackad uppdatering!