Durch die Einführung der flexiblen Heredoc/Nowdoc-Syntax können doc-Zeichenketten, die den schließenden Bezeichner in ihrem Körper enthalten, zu Syntaxfehlern oder einer veränderten Interpretation führen. Zum Beispiel in:
<?php
$str = <<<FOO
abcdefg
   FOO
FOO;
?>FOO bisher keine besondere
    Bedeutung. Nun wird es als Ende der Heredoc-Zeichenkette interpretiert und
    das folgende FOO; führt zu einem Syntaxfehler. Dieses
    Problem kann immer gelöst werden, indem ein schließender Bezeichner
    gewählt wird, der nicht im Inhalt der Zeichenkette vorkommt.
   
  
    Eine continue-Anweisung, die in einer
    switch-Kontrollstruktur verwendet wird, erzeugt nun
    eine Warnung. In PHP sind solche continue-Anweisungen
    gleichbedeutend mit break, während sie sich in anderen
    Sprachen wie continue 2 verhalten.
    
<?php
while ($foo) {
    switch ($bar) {
      case "baz":
         continue;
         // Warning: "continue" targeting switch is equivalent to
         //          "break". Did you mean to use "continue 2"?
   }
}
?>
    Ein Array-Zugriff vom Typ $obj["123"], worin
    $obj ArrayAccess implementiert
    und "123" ein ganzzahliges
    Literal vom Typ string ist, führt nicht mehr zu einer
    impliziten Umwandlung in eine Ganzzahl, d. h., anstelle von
    $obj->offsetGet(123) wird nun
    $obj->offsetGet("123") aufgerufen. Dies entspricht dem
    bestehenden Verhalten für nicht-literale Werte. Das Verhalten von Arrays
    wird davon in keiner Weise beeinflusst; sie wandeln ganzzahlige
    Zeichenketten-Schlüssel weiterhin implizit in Ganzzahlen um.
   
In PHP werden statische Eigenschaften von vererbenden Klassen gemeinsam genutzt, es sei denn, die statische Eigenschaft wird in einer Kindklasse explizit überschrieben. Allerdings war es aufgrund eines Implementierungs-Artefakts möglich, die statischen Eigenschaften durch Zuweisung einer Referenz zu trennen. Dieses Schlupfloch wurde nun behoben.
<?php
class Test {
    public static $x = 0;
}
class Test2 extends Test { }
Test2::$x = &$x;
$x = 1;
var_dump(Test::$x, Test2::$x);
// Vorher:     int(0), int(1)
// Nun:        int(1), int(1)
?>Eine Referenz, die von einem Array- oder Eigenschafts-Zugriff zurückgegeben wird, wird nun im Zuge des Zugriffs aufgelöst. Das bedeutet, dass es nicht mehr möglich ist, die Referenz zwischen dem Zugriff und der Verwendung des Wertes, auf den zugegriffen wurde, zu verändern:
<?php
$arr = [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// Vorher: int(4), Nun: int(3)
?>Das Entpacken von Parametern funktioniert bei Traversables mit nicht-ganzzahligen Schlüsseln nicht mehr. Der folgende Code funktionierte in PHP 5.6-7.2 unbeabsichtigt.
<?php
function foo(...$args) {
    var_dump($args);
}
function gen() {
    yield 1.23 => 123;
}
foo(...gen());
?>Das Hilfsprogramm ext_skel wurde komplett überarbeitet; neue Optionen wurden hinzugefügt und einige alte Optionen entfernt. Es ist nun in PHP geschrieben und hat keine externen Abhängigkeiten.
Die Unterstützung für BeOS wurde eingestellt.
    Exceptions, die im Modus EH_THROW durch die
    automatische Umwandlung von Warnungen in Exceptions ausgelöst werden (z. B.
    einige DateTime-Exceptions), füllen den Bereich von
    error_get_last() nicht mehr mit Daten. Damit
    funktionieren sie nun genauso wie manuell ausgelöste Exceptions.
   
    TypeError meldet nun falsche Typen als
    int und bool anstelle von
    integer bzw. boolean.
   
Undefinierte Variablen, die an compact() übergeben werden, werden nun als Hinweis gemeldet.
    Die Funktion getimagesize() und verwandte Funktionen
    melden nun den Mime-Typ von BMP-Bildern als image/bmp
    anstelle von image/x-ms-bmp, da ersterer bei der IANA
    registriert ist (siehe » RFC 7903).
   
    Die Funktion stream_socket_get_name() gibt nun
    IPv6-Adressen zurück, die in Klammern eingeschlossen sind. Zum Beispiel
    wird nun "[::1]:1337" anstelle von
    "::1:1337" zurückgegeben.
   
Alle Warnungen, die von BCMath-Funktionen ausgelöst werden, verwenden nun die Fehlerbehandlung von PHP. Zuvor wurden einige Warnungen direkt nach stderr geschrieben.
Die Funktionen bcmul() und bcpow() geben nun Zahlen mit der geforderten Genauigkeit zurück. Zuvor wurden in den zurückgegebenen Zahlen unter Umständen die Dezimalnullen am Ende weggelassen.
Anmeldungen über rsh/ssh sind standardmäßig deaktiviert. Um dies zu ändern, muss imap.enable_insecure_rsh verwendet werden. Es ist zu beachten, dass die IMAP-Bibliothek die Namen der Postfächer nicht filtert, bevor sie an den rsh/ssh-Befehl übergeben werden. Daher sollten bei aktiviertem rsh/ssh keine nicht vertrauenswürdigen Daten an diesen Befehl übergeben werden.
   Aufgrund der hinzugefügten Unterstützung für benannte Teilsuchmuster
   verhalten sich mb_ereg_*()-Suchmuster, die diese
   verwenden, anders. Insbesondere werden benannte Teilsuchmuster Teil der
   Treffer sein und mb_ereg_replace() wird die zusätzliche
   Syntax auswerten. Siehe
   Benannte Teilsuchmuster
   für weitere Informationen.
  
   Vorbereitete Anweisungen (Prepared Statements) geben die Sekundenbruchteile
   bei DATETIME-, TIME- und
   TIMESTAMP-Spalten mit Dezimalspezifizierer (z. B.
   TIMESTAMP(6) bei Verwendung von Mikrosekunden) nun
   korrekt an. In früheren Versionen wurden sie in den zurückgegebenen Werten
   einfach weggelassen.
  
   Vorbereitete Anweisungen geben die Sekundenbruchteile bei
   DATETIME-, TIME- und
   TIMESTAMP-Spalten mit Dezimalspezifizierer (z. B.
   TIMESTAMP(6) bei Verwendung von Mikrosekunden) nun
   korrekt an. In früheren Versionen wurden sie in den zurückgegebenen Werten
   einfach weggelassen. Zu beachten ist, dass dies nur die
   PDO_MYSQL-Anweisungen betrifft, bei
   denen die Emulation vorbereiteter Anweisungen deaktiviert ist (z. B. bei
   Verwendung der nativen Prepair-Funktionalität von MySQL). Anweisungen, die
   Verbindungen mit PDO::ATTR_EMULATE_PREPARES=true
   verwenden (die Standardeinstellung), waren von dem behobenen Fehler nicht
   betroffen und erhielten bereits korrekte Sekundenbruchteile von der Engine.
  
   Beim Exportieren von
   Reflection-Objekten in Zeichenketten
   werden nun int und bool anstelle von
   integer bzw. boolean verwendet.
  
Wenn ein SPL-Autoloader eine Exception auslöst, werden die folgenden Autoloader nicht mehr ausgeführt. Zuvor wurden alle Autoloader ausgeführt und die Exceptions wurden verkettet.
Wenn eine mathematische Operation ein SimpleXML-Objekt enthält, wird der Text nun als int oder float behandelt, je nachdem, was besser geeignet ist. Zuvor wurden Werte grundsätzlich als ints behandelt.
Seit PHP 7.3.23 werden die Namen eingehender Cookies aus Sicherheitsgründen nicht mehr URL-dekodiert.
