<?php
function swap( &$a, &$b ): void
  { [ $a, $b ] = [ $b, $a ]; }
?>
   Die Typen für Parameter und Rückgabewerte können nun durch ein
   vorangestelltes Fragezeichen als nullable gekennzeichnet werden. Das
   bedeutet, dass neben dem angegebenen Typ auch null als Parameter
   übergeben bzw. als Wert zurückgegeben werden kann.
  
<?php
function testReturnA(): ?string
{
    return 'elePHPant';
}
var_dump(testReturnA());
function testReturnB(): ?string
{
    return null;
}
var_dump(testReturnB());
function test(?string $name)
{
    var_dump($name);
}
test('elePHPant');
test(null);
test();Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
string(9) "elePHPant" NULL string(9) "elePHPant" NULL Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in...
   Der Rückgabetyp void wurde eingeführt. Funktionen, die mit
   void als Rückgabetyp deklariert sind, müssen ihre return-Anweisung entweder
   ganz weglassen, oder eine leere return-Anweisung verwenden. null ist für
   eine void-Funktion kein gültiger Rückgabewert.
  
<?php
function swap(&$left, &$right): void
{
    if ($left === $right) {
        return;
    }
    $tmp = $left;
    $left = $right;
    $right = $tmp;
}
$a = 1;
$b = 2;
var_dump(swap($a, $b), $a, $b);Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
null int(2) int(1)
   Wenn versucht wird, den Rückgabewert einer void-Funktion zu verwenden, wird
   dieser einfach als null ausgewertet, ohne dass eine Warnung ausgegeben
   wird. Der Grund dafür ist, dass Warnungen die Verwendung übergeordneter
   generischer Funktionen zur Folge hätte.
  
   Die verkürzte Array-Syntax ([]) kann nun als Alternative
   zur bestehenden list()-Syntax verwendet werden, um
   Arrays für Zuweisungen zu zerlegen (auch innerhalb von
   foreach).
  
<?php
$data = [
    [1, 'Tom'],
    [2, 'Fred'],
];
// list()-Format
list($id1, $name1) = $data[0];
// []-Format
[$id1, $name1] = $data[0];
// list()-Format
foreach ($data as list($id, $name)) {
    // der Code mit $id und $name
}
// []-Format
foreach ($data as [$id, $name]) {
    // der Code mit $id und $name
}Es ist nun möglich, den Geltungsbereich von Klassenkonstanten zu definieren.
<?php
class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}Ein neuer Pseudo-Typ (analog zu callable) namens iterable wurde eingeführt. Er kann als Typ für Parameter und Rückgabe verwendet werden, wo er entweder Arrays oder Objekte akzeptiert, die die Schnittstelle Traversable implementieren. Bei abgeleiteten Typen kann der Parametertyp einer Kindklasse die Typen array und Traversable der Elternklasse auf iterable erweitern. Bei den Rückgabetypen kann eine Kindklasse den Rückgabetyp iterable der Elternklasse einschränken auf array oder ein Objekt, das Traversable implementiert.
<?php
function iterator(iterable $iter)
{
    foreach ($iter as $val) {
        //
    }
}
   Ein catch-Block kann nun mehrere Exceptions abfangen, indem er sie durch
   Pipe-Zeichen (|) getrennt auflistet. Dies kann nützlich
   sein, wenn verschiedene Exceptions verschiedener Klassenebenen auf dieselbe
   Weise behandelt werden sollen.
  
<?php
try {
    // etwas Code
} catch (FirstException | SecondException $e) {
    // beide Exceptions behandeln
}
   Es ist nun möglich, Schlüssel mit list() oder mit der
   neuen verkürzten []-Syntax anzugeben. Damit lassen sich
   Arrays mit nicht-ganzzahligen oder nicht-sequenziellen Schlüsseln zerlegen.
  
<?php
$data = [
    ["id" => 1, "name" => 'Tom'],
    ["id" => 2, "name" => 'Fred'],
];
// list()-Format
list("id" => $id1, "name" => $name1) = $data[0];
// []-Format
["id" => $id1, "name" => $name1] = $data[0];
// list()-Format
foreach ($data as list("id" => $id, "name" => $name)) {
    // der Code mit $id und $name
}
// []-Format
foreach ($data as ["id" => $id, "name" => $name]) {
    // der Code mit $id und $name
}
   Bei den
   Funktionen für die Manipulation von Zeichenketten,
   die Offsets akzeptieren, können nun negative Zeichenketten-Offsets
   verwendet werden. Dies gilt auch für die
   Indizierung von Zeichenketten
   mit [] oder {}. In solchen Fällen
   wird ein negativer Offset als Offset relativ zum Ende der Zeichenkette
   interpretiert.
  
<?php
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", "b", -3));Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
string (1) "e" int(3)
Negative Zeichenketten- und Array-Offsets können nun auch in der einfachen Syntax zum Analysieren von Variablen innerhalb von Zeichenketten verwendet werden.
<?php
$string = 'bar';
echo "Das letzte Zeichen von '$string' ist '$string[-1]'.\n";
?>Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Das letzte Zeichen von 'bar' ist 'r'.
Durch Erweiterung der Funktionen openssl_encrypt() und openssl_decrypt() um zusätzliche Parameter wird nun AEAD (die Modi GCM und CCM) unterstützt.
Der Klasse Closure wurde eine neue statische Methode hinzugefügt, mit der Callables einfach in Closure-Objekte umgewandelt werden können.
<?php
class Test
{
    public function exposeFunction()
    {
        return Closure::fromCallable([$this, 'privateFunction']);
    }
    private function privateFunction($param)
    {
        var_dump($param);
    }
}
$privFunc = (new Test)->exposeFunction();
$privFunc('irgendein Wert');Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
string(10) "irgendein Wert"
Eine neue Funktion namens pcntl_async_signals() wurde eingeführt, um eine asynchrone Signalverarbeitung ohne Verwendung von Ticks (die eine Menge zusätzliche Rechenzeit verursachen) zu ermöglichen.
<?php
pcntl_async_signals(true); // asynchrone Signale einschalten
pcntl_signal(SIGHUP,  function($sig) {
    echo "SIGHUP\n";
});
posix_kill(posix_getpid(), SIGHUP);Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
SIGHUP
   Die Erweiterung CURL unterstützt nun "Server-Push" (erfordert Version 7.46
   und höher). Dies kann durch die Funktion
   curl_multi_setopt() mit der neuen Konstante
   CURLMOPT_PUSHFUNCTION genutzt werden. Die Konstanten
   CURL_PUSH_OK und CURL_PUSH_DENY
   wurden ebenfalls hinzugefügt, damit die Ausführung des
   Server-Push-Callbacks entweder genehmigt oder verweigert werden kann.
  
Die Stream-Kontext-Option tcp_nodelay wurde hinzugefügt.
Note that declaring nullable return type does not mean that you can skip return statement at all. For example:
php > function a(): ?string { }
php > a();
PHP Warning:  Uncaught TypeError: Return value of a() must be of the type string or null, none returned in php shell code:2
php > function b(): ?string { return; }
PHP Fatal error:  A function with return type must return a value (did you mean "return null;" instead of "return;"?) in php shell code on line 2