Wat er nieuw is in PHP 7.4

Auteur: Maarten Bode

PHP 7.4 zit vol met nieuwe features waar je als PHP developer enthousiast van gaat worden. Ik heb voor je op een rij gezet wat je van deze release kan verwachten.

Arrow Functions

Een functie waar jaloers naar werd gekeken door PHP developers die ook wel eens met JavaScript werken, is nu geïmplementeerd in PHP zelf.

Waar je voorheen vaak met een omslachtige callback moest werken...

array_map(function (Post $post) {
  return "/blog/{$post->slug}";
}, $posts)

...kan dat nu ook met een arrow function:

array_map(fn (Post $post) => "/blog/{$post->slug}", $posts)

Dit heeft ook als voordeel dat variabelen van buiten je callback gewoon beschikbaar zijn in je callback en je dus geen use meer hoeft te gebruiken:

// Voorheen
array_filter($posts, function (Post $post) use ($request) {
  return $post->user->is($request->user());
})

// PHP 7.4
array_filter(
  $posts,
  fn (Post $post) => $post->user->is($request->user()),
)

Typed Properties

PHP is sinds een aantal jaar bezig de taal, optioneel, strikter te maken.

Sinds PHP 5.0 (2004) was het al mogelijk in de parameters van je method op te geven welke class je verwacht.

public function setAuthor(Author $author)

In PHP 7.0 (2015) werden daar de ingebouwde 'primitive' types aan toegevoegd (bijvoorbeeld string of int).

public function meetsAgeRequirement(int $age)

Vanaf PHP 7.4 is het ook mogelijk dit voor properties te doen. Dit werkt zowel met de ingebouwde 'primitive' types als classes.

class User {
  public ?Avatar $avatar;
  public string $name;
}

Hiermee waarborg je dat een property altijd van een bepaald type is. Wanneer je dus een Post wilt setten naar een User, zal PHP een error geven.

De volgende primitive types worden gesupport:

  • int
  • float
  • string
  • iterable
  • array
  • object
  • self
  • parent
  • bool

Preloading

De bestanden van bijvoorbeeld frameworks werden voorheen per request in de memory geladen. Sinds PHP 7.4 heb je de optie dit bij het opstarten van PHP al te doen, wat een betere performance als resultaat heeft.

Omdat dit een aantal side-effects heeft en enige configuratie vereist, moet je dit zelf activeren. Net zoals opcache zullen de aanpassingen die je doet aan bestanden namelijk niet direct zichtbaar zijn.

Een uitleg over hoe preloaden werkt kan je hier vinden.

Composer is bezig met het inbouwen van support voor preloaden, waardoor je het bestand waarin je opgeeft welke bestanden moeten worden geladen niet zelf hoeft te schrijven. Er staat hier op moment van schrijven een issue voor open.

FFI: Foreign Function Interface

Hoewel PHP de afgelopen jaren vele malen sneller is geworden, blijft een taal als C altijd sneller. In PHP 7.4 is daarom nu ondersteuning voor het uitvoeren van C code vanuit PHP. Dit betekent dat ontwikkelaars Composer packages kunnen maken die directe C code uitvoeren.

Spread Operators

Het is nu mogelijk om spread operators te gebruiken in een array:

$developers = ['Wiljan', 'Maarten', 'Tim', 'Jelmer'];
$teamMembers = ['Niels', 'Maurits', ...$developers];

// ['Niels', 'Maurits', 'Wiljan', 'Maarten', 'Tim', 'Jelmer']

Coalesce Assign Operator

Een stukje syntactische suiker om bijvoorbeeld...

$user['job'] = $user['job'] ?? 'Developer';

...te vervangen met...

$user['job'] ??= 'Developer';

Wanneer de waarde aan de linkerkant niet null is, wordt de waarde aan de linkerkant aangehouden. Is dat niet het geval, wordt de waarde van de rechterkant toegekend.

Deprecations

Naast een paar geweldige nieuwe features, zijn er ook een aantal zaken gedeprecate.

money_format() functie

Te vervangen met de NumberFormatter class.

array_key_exists() op een object

Het is niet meer mogelijk deze functie aan te roepen op een object. Best logisch, gezien de naam.

::parent zonder parent class

Waar je voorheen in bijvoorbeeld een constructor parent::construct() kon aanroepen terwijl je geen class extend, mag dit niet meer in PHP 7.4

In dit artikel op PHP.net staan alle deprecations uitgewerkt.

Tot slot

De definitieve release candidate (GA) van PHP 7.4 komt naar verwachting op 28 november uit. In Laravel Forge is de upgrade al beschikbaar:

Op korte termijn al met PHP 7.4 en de nieuwste technieken werken? We zoeken een back-end developer om ons team te versterken.