PHP 8

Marcus Olsson,

PHP8

Tänk att det redan har gått fem och ett halvt år sedan PHP 7 släpptes! Idag är då alltså dags för nästa stora release; PHP 8.

PHP 8 har med sig flera riktigt bra och smidiga nya funktioner som kommer att göra livet bra mycket lättare för oss som arbetar med det dagligen. Dessutom plockas en del funktionalitet helt bort som blev deprikerade/började fasas ut i PHP 7.4. En snabb titt på några av dem:

str_contains()

Äntligen! Tänk alla åren som man har skrivit följande kodsnutt:

if (strpos('hustomte', 'tomte') !== false) { }
if (strpos('hustomte', 'tomte') !== false) { }

Nu kan man helt enkelt istället skriva följande tack vare en ny helper:

if (str_contains('hustomte', 'tomte')) { }
if (str_contains('hustomte', 'tomte')) { }

Som bonus kommer även str_ends_with() och str_starts_with() med. Gör precis det man föreställer sig.

"Union types" och ny "Mixed type"

Tidigare har det varit ganska meckigt att typea sin kod i PHP då man bara får ange en returtyp, och dessutom så var "mixed" inte en av dessa. T.ex.

function divide(int $a, int $b): int {
return $a/$b;
}
echo divide(5, 6); // 0
function divide(int $a, int $b): int {
return $a/$b;
}
echo divide(5, 6); // 0

Nu tillåts man att göra t.ex.

function divide(int $a, int $b): int|float {
return $a/$b;
}
echo divide(5, 6); // 0.83
function divide(int $a, int $b): int|float {
return $a/$b;
}
echo divide(5, 6); // 0.83

Eller för all del:

function divide(int $a, int $b): mixed {
return $a/$b;
}
echo divide(5, 6); // 0.83
function divide(int $a, int $b): mixed {
return $a/$b;
}
echo divide(5, 6); // 0.83

"Named arguments"/"named parameters"

Föreställ dig att du har funktionen:

function document(
string $text,
string $font = '',
bool $html = false,
int $size = 14
) {}
function document(
string $text,
string $font = '',
bool $html = false,
int $size = 14
) {}

I de fallen man endast vill sätta $text och $size får man kanske göra:

$object->document('my string', '', false, 18);
$object->document('my string', '', false, 18);

Andra och tredje parametern är onödiga (och kan vara svårt att förstå vid en snabb överblick). I PHP 8 kan du helt enkelt istället:

$object->document(text: 'my string', size: 18);
$object->document(text: 'my string', size: 18);

Intressant är att man dessutom kan kombinera detta med array spreads:

$arr = [
'text' => 'my string',
'size' => 18
];
$object->document(...$arr);
$arr = [
'text' => 'my string',
'size' => 18
];
$object->document(...$arr);

Snabbåtkomst till klassnamn

Relativt vanligt är att man behöver jämföra olika klassobjekt och handla därefter. I.o.m. PHP 8 finns en snygg liten genväg för att komma åt just klassnamnet:

namespace App\Library;
class MyClass {}
// --
$object = new \App\Library\MyClass;
var_dump(get_class($object)); // < PHP 8, string(19) "App\Library\MyClass"
var_dump($object::class); // >= PHP 8, string(19) "App\Library\MyClass"
namespace App\Library;
class MyClass {}
// --
$object = new \App\Library\MyClass;
var_dump(get_class($object)); // < PHP 8, string(19) "App\Library\MyClass"
var_dump($object::class); // >= PHP 8, string(19) "App\Library\MyClass"

@-operatorn är helt borttagen

I tidigare versioner av PHP har man kunna gömma fel med @, vilket blev deprikerat PHP 7.4.

Allt detta är bara ett fåtal av de nyheterna som PHP 8 för med sig, spana också in t.ex. "Constructor property promotion" (PHP.net), "Nullsafe operator" (PHP.net) och "Non-capturing catches" (PHP.net).

Medan PHP 7 förde med sig enorma prestandaförbättringar så verkar PHP 8 mer fokusera på att lägga till och förbättra nödvändig funktionalitet som har tillkommit de senaste åren – samtidigt som man städar ut sådant som kanske aldrig skulle funnits från början i ett modernt programmeringsspråk.

PHP 7.4 lär finnas kvar ett bra tag till (aktiv support fram till 28 nov 2021, säkerhetspatcher t.o.m. 28 nov 2022). Dock så fasas idag 7.2 ut helt, och 7.3 får om ett par dagar endast stöd i form av säkerhetsuppdateringar.

Uppdaterat 2020-11-27: Missade att php.net lanserade en ny smidig liten undersida som visar på ett gäng av nyheterna i PHP 8, väl värt att spana in för att få en snabb uppdatering på vad som är nytt.