It’s early December 2020 and yes we have received a stable new major version of PHP8. Is it good? better than v7? The hell is that JIT and how easy is to swap your v7 application? Well don’t go anywhere and read this article my PHP developer…
Magic Just-In-Time (JIT) performance
Just-In-Time it’s atually easy to explain. So currently the PHP was parsed language, meaning that once any PHP file was called it would parse (by PHP parser) any other linked PHP files or code sections. Even if such file was never used or called. Let’s have a look at this example
function getAnswer($doYouLikeOmelakBlog) { if ($doYouLikeOmelakBlog) { echo 'great you win!'; } else { require_once('readMoreOnBlog.php'); } }
In PHP7 and older verions when you call getAnswer(true)
the PHP parser would still parse the contents of the readMoreOnBlog.php
file. With JIT on PHP8 the included file would not be parsed any more.
//by running the line: getAnswer(true); //PHP7 and less would parse the readMoreOnBlog.php file in FULL //PHP8 will skip the whole required file!
What does the above mean? Well, if you ever hear a news that MVC is slow in PHP and it should be replaced with middleware, then guess what? The performance difference is now minimalistic! So there is no reason to ignore MVC any more.
The new JIT integration implementation started in late 2014, however for unknown reasons this particular extension hasn’t been released since then (hence surprise in PHP8). Even though JIT is a major improvement, it might not give a fast push to the web-based websites due to the nature of these projects. The best cases for Just-In-Time compilation are all continuously running process, like Java or Node.js. This can lead to creation of sandbox running PHP similar to Node.js approach, but this has not been mentioned anywhere yet.
Consistent Type Errors
Even though TypeErrors have been introduced in 7.0, not all the areas have been updated yet. Some of the sections still fail by returning NULLs. The most userland function already throws them, but the internal function still has some edge cases and wrong behaviours.
//PHP7 strlen([]); // Warning: strlen() expects parameter 1 to be string, array given //PHP8 strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
Optional Arguments in Function Calls
Specify which optional parameters you set by calling their aliases, instead of passing nulls in front:
//signature of mail() mail ( string $to , string $subject , string $message [, mixed $additional_headers [, string $additional_parameters ]] ) : bool //PHP 7 mail('adam@omelak.com', 'Test subject', 'Message', null, $extraParams); //PHP8 mail('adam@omelak.com', 'Test subject', 'Message', additional_parameters: $extraParams);
Shortcut for Constructor Properties
Are you lazy programmer? If so, you can defin your class properties inside of contrcutor! Now that’s awkward…
//PHP8 class MyClass { public function __construct( public bool $a = true, public int $b = 1, public string $c = 'a property in constructor, woop!', ) {} }
Multi Types
Aka, “Union Types” allows now to define more than one type for property, separated by pipes:
//PHP8 private int|float $number
New “match()” Expression
Another shortcut for common switch()
statement, which doesn’t require keywords like break
, case
or default
:
//PHP8 match ('thirdCase') { 'firstCase' => "Nope!", 'secondCase' => "Still nope", 'thirdCase' => 'Hell yeah!' }; //returns: Hell yeah!
Nullsafe Operator
Now finally, something which should be available in PHP 7 a while ago, nullsafe operator allows you to call methods, properties on some object which may or may not be empty, null. For instance:
//PHP7 if (isset($user)) { if ($user->getProfile() !== null) { echo $user->getProfile()->getName(); } } //PHP8 echo $user?->getProfile()?->getName();
Confusing Attributes in Comments
Another way for adding comments. Just use the hash character and viola, you are writing documentation by using a structured metadata with PHP’s syntax:
//PHP8 #[Route("/api/users/{id}", methods: ["GET"])] public function get($id) { /* ... */ }
Upgrade from PHP7 -> PHP8
You would assume that a transition between 7.4 to 8.0 is smooth right? Well you can’t be more wrong about it. Here are the backward incompatibilities: https://www.php.net/manual/en/migration80.incompatible.php , deprecated bits: https://www.php.net/manual/en/migration80.deprecated.php and finally some other changes: https://www.php.net/manual/en/migration80.other-changes.php