Wat er nieuw is in PHP 7.4
⚠️ Dit artikel verscheen eerder op orangetalent.dev
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:
⚠️ Dit artikel verscheen eerder op orangetalent.dev
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: