PHP 8: What you need to know about the latest update

PHP is one of the programming languages that is easiest to learn. With a PHP tutorial and the right motivation, you can write the first scripts and execute commands within a few hours. PHP 7 introduced speed optimisation, which led to an improved ranking. Version 8 of PHP further improved on this and introduced other new features.


PHP 8 release in November 2020

On November 26th 2020, PHP 8.0.0 - the latest edition of the popular scripting language - was released. This corresponds to the normal three-year cycle for PHP. The predecessor PHP 7.4 was around for about a year after support for PHP 7.1 was discontinued. Support for PHP 7.2 will also end at the end of 2020. Many websites developed in PHP still rely on the old versions. Although this is technically possible, it is not recommended. Keeping your website code up-to-date and switching to new versions of PHP has various advantages: New functions offer more variety, performance can be massively increased, and security gaps are closed.

Try out PHP 8 now!

Not yet a IONOS customer? We have several low-cost web hosting packages to choose from. Once signed up, you can change the PHP version you’re using in your IONOS customer account and upgrade to PHP 8.

What are the problems with the old code?

Because PHP 8 is a major new release, one should expect old code to no longer be compatible. However, most of the changes that could lead to complications were already addressed in versions 7.2, 7.3, and 7.4.

The latest changes include:

  • The real type
  • Magic quotes legacy
  • array_key_exists() with objects
  • Reflection export() methods
  • mb_strrpos() with encoding as 3rd argument
  • implode() parameter order mix
  • Unbinding $this from non-static closures
  • hebrevc() function
  • convert_cyr_string() function
  • money_format() function
  • ezmlm_hash() function
  • restore_include_path() function
  • allow_url_include ini directive

If you have always kept your code up to date, you won’t have any problems migrating to PHP 8, even if the new update is a major release without backward compatible changes. A complete list of changes can be found on the PHP project site.

These are the new PHP 8 features

The new version of PHP has some new features that provide web developers with lots of additional possibilities. Here we have summarised the most important adjustments compared to the predecessors.

JIT Compiler

Among the major new feature of PHP 8 is the JIT compiler, which improves performance significantly. PHP is not compiled, but interpreted line by line. The JIT compiler (Just in Time) works by compiling parts of the code during runtime - and in doing so acts very much like a cached version of the code.

This new feature in PHP 8 has already been tested by Pedro Escudero. He used a simple script to compare versions 5.3, 7.4, and 8 (with and without JIT). For this purpose, he ran the script 100 times in each version and then calculated the average time.

The following average values were the results of his testing:

Version Time in Seconds
5.3 0.64574003219604
7.4 0.10253500938416
8 (without JIT) 0.098223924636841
8 (with JIT) 0.053637981414795

Even if changing from version 7.4 to 8 without JIT does not make much difference, the difference to version 8 with JIT is significant. The JIT Compiler improves performance by more than 45 percent.

Union Types

Union Types are known from other languages like C/C++, TypeScript or Haskell. Here two or more types can form a union and any of the types mentioned can be used. In the code itself this can look like this:

public function foo(Foo|Bar $input): int|float;

However, there is one restriction, because void cannot become part of a union type; it does not output a return value. Also, nullable unions can be declared with |null or ? as in this example:

public function foo(Foo|null $foo): void;
public function bar(?Bar $bar): void;

Static return type

Static is a special class name and becomes a valid return type in the new version besides self & parent.


WeakRefs were already added in PHP 7.4. With PHP 8, however, WeakMaps have been included which are the extension of this function. WeakMaps and WeakRefs can be used to delete objects when only the cache references the entity classes of the objects. This leads to resource-saving handling of the objects. An example from the documentation is as follows:

class FooBar {
    private WeakMap $cache;
    public function getSomethingWithCaching(object $obj) {
        return $this->cache[$obj] ??= $this->computeSomethingExpensive($obj);
    // ...

Use ::class for objects

In earlier versions, you had to use get_class() to assign a class to objects. But now, you can apply ::class to objects. This ensures that the source code is kept slimmer.

Stringable interface

The Stringable interface is automatically added to classes that implement the __toString() method. Previously, this step had to be done manually. The code looks like this:


class Foo
    public function __toString(): string
        return 'foo';
function bar(Stringable $stringable) { /* … */ }
bar(new Foo());


Using the new fdiv() function, division with 0 is allowed. You now get INF, -INF or NAN as return value.

Type annotations

In PHP 8, correct type annotations are added for all internal functions and methods.

Type errors

Previously, only user-defined functions triggered TypeErrors. Internal functions issued a warning and null. In PHP 8 most internal functions now also return a type error.

New classification for engine warnings

Until PHP 8, there were lots of errors that only issued a warning or note. This has now been updated. A full listing of the new PHP error messages can be found in the documentation.

@ won’t supress errors aymore

This new feature allows errors to be detected, too. Instead of suppressing them with the @-operator, as was previously the case, you should now make sure that you have set display_errors=Off on the server.

Correct signature of magic methods

In previous PHP versions, it was possible to write magic methods with signatures that did not match the expected signature, for example __clone(): float or __isset(): Closure. Since the introduction of PHP 7.0, the correct use of magic methods has only been randomly checked. Various parameter and return value checks have been added to the new version to ensure that the signatures are correct.


echo "sum: " . $a + $b;

This was previously interpreted by PHP as:

 echo ("sum: " . $a) + $b;

PHP 8 now turns it into:

echo "sum: " . ($a + $b);


The Reflection signatures have been changed. Originally, Reflection was specified as follows:


ReflectionMethod::invoke($object, $args);

However, in PHP 8 it is now written like this:

ReflectionMethod::invoke($object, ...$args);

To support PHP 7 & PHP 8 at the same time, you should proceed as follows:

ReflectionClass::newInstance($arg = null, ...$args);
ReflectionFunction::invoke($arg = null, ...$args);
ReflectionMethod::invoke($object, $arg = null, ...$args);

Wait! We’ve got something for you!
Get your domain for just £1/1st year.

Enter the web address of your choice in the search bar to check its availability.
12 months for £1
then £10/year