A lowdown of PHP 8.0 update

Galaxy Weblinks
3 min readDec 11, 2020

The latest major update in PHP 8 has been made available to the public. It’s a typical three-year cycle version upgrade of PHP. Comes with a few radical alterations, so there’s a high chance you’ll need to make a few changes in code before upgrading.

Some of the major features and optimizations introduced in this update are named arguments, union types, attributes, constructor property promotion, match expression, nullsafe operator, JIT, and improvements in the type system, error handling, and consistency.

Here’s a lowdown of the official update announcement:

PHP 8 Named arguments

// PHP 7htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, ‘UTF-8’, false);// PHP 8// Specify only required parameters, skipping optional ones.// Arguments are order-independent and self-documented.htmlspecialchars($string, double_encode: false);

PHP 8 Attributes

Instead of PHPDoc annotations, you can now use structured metadata with PHP’s native syntax.

// PHP 7class PostsController{/*** @Route(“/api/posts/{id}”, methods={“GET”})*/public function get($id) { /* … */ }}// PHP 8class PostsController{#[Route(“/api/posts/{id}”, methods: [“GET”])]public function get($id) { /* … */ }}

PHP 8 Constructor property promotion

Less boilerplate code to define and initialize properties.

// PHP 7class Point {public float $x;public float $y;public float $z;public function __construct(float $x = 0.0,float $y = 0.0,float $z = 0.0,) {$this->x = $x;$this->y = $y;$this->z = $z;}}// PHP 8class Point {public function __construct(public float $x = 0.0,public float $y = 0.0,public float $z = 0.0,) {}}

PHP 8 Union types

Instead of PHPDoc annotations for a combination of types, you can use native union type declarations that are validated at runtime.

// PHP 7class Number {/** @var int|float */private $number;/*** @param float|int $number*/public function __construct($number) {$this->number = $number;}}new Number(‘NaN’); // Ok// PHP 8class Number {public function __construct(private int|float $number) {}}new Number(‘NaN’); // TypeError

PHP 8 Nullsafe operator

In the latest version you can use a chain of calls with the new nullsafe operator instead if null check conditions. In case of chain failure, the execution of the entire chain aborts, and the entire chain evaluates to null.

// PHP 7$country = null;if ($session !== null) {$user = $session->user;if ($user !== null) {$address = $user->getAddress();if ($address !== null) {$country = $address->country;}}}// PHP 8$country = $session?->user?->getAddress()?->country;

PHP 8 Match expression

The new match is similar to switch and has the following features:

Match is an expression, meaning its result can be stored in a variable or returned.

Match branches only support single-line expressions and do not need a break; statement.

Match does strict comparisons.

// PHP 7switch (8.0) {case ‘8.0’:$result = “Oh no!”;break;case 8.0:$result = “This is what I expected”;break;}echo $result;//> Oh no!// PHP 8echo match (8.0) {‘8.0’ => “Oh no!”,8.0 => “This is what I expected”,};//> This is what I expected

Since the update has breaking changes, it’s advisable to have experts help you with the migration to avoid any unexpected downtime. We have a team of experts that’s well versed in PHP. Get in touch with us here if you’re looking for a quick and hassle-free upgrade.

Originally published at https://blog.galaxyweblinks.com on December 11, 2020.

--

--

Galaxy Weblinks

Transforming forward-thinking ideas into bold digital experiences.