PHP 7.4

Marcus Olsson,

Nästa stora release av PHP är nu ute i det fria – samtidigt så går 7.2 ur tiden.

Utvecklingen fortsätter att gå i en rasande snabb takt för PHP. Antalet tillägg och förbättringar sedan PHP 7.0 släpptes (snart fyra år sedan!) är nästintill oräkneliga, och flera av dem har påverkar utvecklingen och hur man jobbar i språket markant.

Även PHP 7.4 har en rad nyheter – som andra än mig säkerligen kan förklara bättre och mer i detalj – men ett par finner jag extra intressanta, t.ex:

Types properties

Man kan nu direkt på klasser sätta typer på variabler:

1<?php
2 class Booking {
3 protected int $id;
4 public int $userId;
5 public string $location;
6 }
1<?php
2 class Booking {
3 protected int $id;
4 public int $userId;
5 public string $location;
6 }

Försöker du sätta $booking->userId = 'hej' får du här helt enkelt ett TypeError-fel:

1Typed property Booking::$userId must be int
1Typed property Booking::$userId must be int

Denna kommer att bli väldigt intressant att följa för att se hur det påverkar PHP-communityt. Många har uppskattat PHP för att det är så "löst type:at".

Men om t.ex. Sebastian Bergmann väljer att skriva om PHPUnit för att ha det mer hårt type:at (som nyligen gjordes för flera funktioner när t.ex. setUp fick void som returtyp), då kommer folk mer eller mindre att tvingas in i att sätta typer på sina variabler och funktioner – något som kanske inte går hem hos alla.

Arrow functions

Tidigare för även de enklaste anonyma funktionerna kunde man få skriva en hel del kod, ofta "övertydlig". Här med ett exempel i Laravel för att hämta ut aktiva beroende på status genom filter-metoder i Collections och Eloquent.

1<?php
2class UserController {
3 public function index(Request $request)
4 {
5 $users = User::get()->filter(function($user) use ($request) {
6 return ($user->status == $request->status);
7 });
8 }
9}
1<?php
2class UserController {
3 public function index(Request $request)
4 {
5 $users = User::get()->filter(function($user) use ($request) {
6 return ($user->status == $request->status);
7 });
8 }
9}

Nu kan man förenkla det något; det fina är att man även kan skippa use-statements i flera fall:

1<?php
2class UserController {
3 public function index(Request $request)
4 {
5 $users = User::get()->filter(
6 fn($item) => ($item->status == $request->status)
7 );
8 }
9}
1<?php
2class UserController {
3 public function index(Request $request)
4 {
5 $users = User::get()->filter(
6 fn($item) => ($item->status == $request->status)
7 );
8 }
9}

Finns såklart många fler nyheter, t.ex. "Unpacking inside arrays" som kan ha flera användningsområden, spana in PHPs migrerings-guide för att läsa om alla nyheterna: php.net/manual/en/migration74.new-features.php

Samtidigt så slutar alltså aktiv utveckling av PHP 7.2, och PHP 7.1 mottar inte längre heller några säkerhetspatcher. Använder nu något av dessa bör du fundera på att uppdatera inom en snar framtid.

7.3 har aktiv support fram till december 2020, och därefter ett år av eventuella säkerhetsåtgärder.