1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Neues in PHP 7

Dieses Thema im Forum "PHP" wurde erstellt von saftmeister, 19. September 2015.

  1. saftmeister

    saftmeister Nutze den Saft! Premium-User

    Ich hatte bereits einen Ausblick auf PHP 5.5 geschrieben, jetzt kommt PHP 7 dran.

    PHP 7 ist ein neues Major Release, das bedeutet, jede Menge neue Features, abschneiden von alten Zöpfen und was sich sonst noch geändert hat.

    Eines Vorweg: PHP 7 wird doppelt!!! so schnell laufen wie PHP 5.6. Schon das allein sollte Grund genug sein, auf die neue Version zu wechseln. Doch zunächst, was nicht mehr funktioniert:
    • (Short-)Tags wurden entfernt. Die Erkennung für die Tags <% und <script language="php"> wurde entfernt.
    • Die Erweiterung ereg wurde entfernt, statt dessen die preg-Extension verwenden.
    • Die Erweiterung mysql wurde nun endlich entfernt, statt dessen PDO oder MySQLi verwenden.
    • Funktion split() wurde entfernt, statt dessen sollte nun explode() verwendet werden.
    • Warnung entfernt, wenn date.timezone nicht gesetzt ist. Standard für diese Einstellung ist schon seit jeher UTC.

    Veraltet gekennzeichnet:
    • PHP4-Konstruktoren sind als veraltet gekennzeichnet. Klassen-Methoden, die als Namen den der Klasse verwenden, sind in PHP7 noch als Konstruktoren verwendbar - zusätzlich zu __construct(). In PHP 8 werden diese Funktionen nicht mehr als Konstruktoren anerkannt.

    Was wurde geändert:
    • Es wurde die Uniform Variable Syntax eingeführt. Die Reihenfolge in der eingebettete Variablennamen-Auflösungen durchgeführt werden, ist jetzt links-nach-rechts. In PHP 5.6 und früher war dies rechts-nach-links. Beispiel:
    PHP 5.6: $a->$b['c'] => zuerst wird $b['c'], danach das Ergebnis davon an $a-> angehängt.
    PHP 7: Zuerst wird $a->$b aufgelöst, danach das Ergebnis mit ['c'] komplettiert.
    Um dieses Verhalten wieder auf den alten Zustand zu bringen, ist das Setzen von geschweiften Klammern notwendig.

    Dieses Verhalten gilt sowohl für Variablen als auch Funktionsaufrufe.​
    • T_PAAMAYIM_NEKUDOTAYIM gibt es nicht mehr wirklich, eingebettete Funktionsaufrufe (zB. Funktionsnamen in Variablen mit anschließender Parameter-Liste wirft diesen Fehler nun nicht mehr. Beispiel:
    Code (PHP):
    1. // Funktioniert auch in PHP 5.6
    2. $a = "sprintf";
    3. echo $a("%d\n", 5);
    4.  
    5.  
    6. // Funktioniert ab PHP 7
    7. function a()
    8. {
    9.     return "sprintf";
    10. }
    11. echo a()("%d mal fump", 7);
    Das ist neu:
    • Engine Exceptions eingeführt; Sog. Recoverable Errors, Warnings und Notices führen jetzt zu einer entsprechenden Exception, die abgefangen und behandelt werden kann. E_CORE_ERROR, E_COMPILE_ERROR und E_PARSE werden (zunächst) nicht als Exceptions verfügbar sein.
    • Throwable Interface wird eingeführt. Da die zuvor genannten neuen Exceptions nicht von der Klasse "Exception" ableiten, sondern von einer neuen Klasse "BaseException", wird eine Schnittstelle notwendig, um alle Exception-Typen unter einem Begriff zusammen zu fassen.
    • Zufallsfunktionen für den täglichen Gebrauch; Es sind zwei neue Funktionen eingebaut, mit denen man einen zufälligen String (random_bytes()), sowie eine zufällige Zahl aus einem vorgegebenen Bereich (random_int()) generieren lassen kann.
    • Anonyme Klassen werden eingeführt. Eine anonyme Klasse ist eine solche, welche direkt zur Laufzeit generiert und ein Objekt daraus erzeugt wird. Dies kann insbesondere für Callbacks angewendet werden.
    • Diverse neu reservierte Schlüsselworte
    • Datentypen für skalare Werte; Einfache Datentypen, wie String, Integer, Float, etc. können nun über einen strikten Modus erzwungen werden, bei dem eine Exception geworfen wird, wenn der übergebene Wert nicht dem erwarteten Typen entspricht.

    In zweiten Teil dieses Threads gibt es noch mehr neues.
     
    Davicito, ThiKool, ComFreek und 2 anderen gefällt das.
  2. saftmeister

    saftmeister Nutze den Saft! Premium-User

    Teil 2 (noch nicht komplett, muss aber mal Speichern):

    Das fällt weg:

    • Einige Server-APIs und Erweiterungen (zusätzlich zu ext/mysql und ext/ereg), die als tot anerkannt sind, werden entfernt. Da es zu viele sind, sollte jeder einen Blick in das RFC werfen.
    • Support von Zeichenketten bei list(). Das Verhalten von list() in Kombination mit Zeichenketten ist nicht konsequent, daher wurde der Support dafür komplett entfernt. Statt dessen soll list() dort stärker sein, wofür es entworfen wurde: dem Einsatz bei Arrays.

    Das ändert sich:

    • ext/json wird zu ext/jsond. Grund ist, dass ext/json nicht unter einer freien Lizenz steht, was einige Distributionen davon abhält, es mit zu liefern.
    • Zusätzlicher Parameter für json_encode, um Gleitkomma-Zahlen zu erzwingen.
    • Im Unterbau: Schnelle Parameter-Parsing-Schnittstelle. Wenn jemand sich ausschließlich mit der Sprache selbst und nicht dem Innenleben beschäftigt, findet diesen RFC möglicherweise langweilig. Aber eines am Rande: Damit beschleunigt sich die Ausführung von PHP-Code um einiges, immerhin 2,5% weniger Zeit.
    • Nativer Thread-Lokaler-Speicher (TLS): Möglicherweise ist der ausgeführte Code auf Thread-Safety-Runtimes etwas schneller als bisher, jedoch mindestens genauso schnell. Es handelt sich eher um eine interne Verbesserung der Wartung des Codes und Stabilität.
    • Umbau-Arbeiten am Verhalten von Integer-Werten. Bisher gibt es ein paar unstimmige Platform-Abhängigkeiten, die mit dem neuen Release gerade gezogen werden. Zu dem gibt es auch Änderungen beim Verhalten von Überläufen bei Zahlen.
    • Anpassung an die Gegebenheiten eines 64-Bit-Systems. Dadurch ist der volle Adress-Raum einer 64-Bit-Anwendung garantiert, mit allen seinen positiven und negativen Konsequenzen. Zahlen können größer, Zeichenketten länger sein.
    • session_start() bekommt ein paar Konfigurationsparameter. Dadurch kann man das Laufzeitverhalten von Sessions besser steuern und einige Geschwindigkeitsverbesserungen heraus kitzeln.

    Das gibt es neu:

    • Spaceship-Operator: Mit diesem Operator können Vergleiche (wie ==, <=, =>, etc) gezogen werden, und er liefert statt einem true oder false eine positive, negative Zahl oder 0 zurück und verhält sich damit so ähnlich wie strcmp().
    • Rückgabe-Werte von Funktionen: Es ist nun möglich, den Typ der Rückgabe einer Funktion zu erzwingen. Sollte ein anderer Typ als der erzwungene zurück gegeben werden, wird ein E_RECOVERABLE_ERROR geworfen, was laut dem ersten Teil zu einer entsprechenden Exception führt.
    • Unicode-Escaping: Es ist nun möglich, Zeichen aus dem Unicode-Zeichensatz im String zu erzwingen.
    • Null-Coalesce-Operator: Viele haben ihn schon mal gesehen, einige nutzen ihn täglich: den ternären Operator. Jetzt bekommt er einen Bruder, der sich auf die Code-Lesbarkeit auswirkt: den Operator "??". Beispiel:
    Code (PHP):
    1. $pageid = isset($_GET['pageid']) ? $_GET['pageid'] : 0;
    2.  
    3. // verhält sich genauso wie
    4.  
    5. $pageid = $_GET['pageid'] ?? 0;
    • Abstrakter Syntax-Baum: Auch hier wieder ein Feature, was sich auf die Geschwindigkeit auswirkt. Wem es nicht zu technisch ist und Interesse am Unterbau von PHP hat, sollte sich das RFC mal durchlesen. Für die anderen: Gibt Gummi und spart Sprit ;)
    • Nicht-statischer Aufruf einer Closure. Die Verwendung von anonymen Funktionen (Closures) bekommt jetzt ein Feature, das einige bestimmt schon vermisst haben. Es wirkt sich auf die Qualität und auch ein klein wenig auf die Geschwindigkeit des Codes bei Verwendung von Closures mit mehreren Aktionen auf dem selben Objekt aus.
    • Abfangbare Exception bei einem Aufruf einer Methode auf einem Nicht-Objekt (oder kurz: NullPointerException)
    • Filterbares unserialize(): Unerwünschte Daten können nun bei unserialize() entfernt werden. Es gibt einen neuen Parameter, mit dem man steuern kann, welche Objekte (anhand des Klassennamens) bei unserialize() nicht mehr de-serialisiert werden sollen.
    • Neue Klasse IntlChar für ext/intl: Damit kann man Unicode-Zeichen als Objekte verwenden und entsprechend behandeln.
     
    Zuletzt bearbeitet: 3. Oktober 2015
    Davicito, ThiKool und sheel gefällt das.
  3. sheel

    sheel I love Asm Administrator

    ENDLICH!
    :D
     
    Parantatatam, saftmeister und ComFreek gefällt das.
  4. mermshaus

    mermshaus Erfahrenes Mitglied

    Keine Angst, die Hosting-Anbieter werden das schon noch nachrüsten. :D (Nein, keine Ahnung.)
     
  5. NetBull

    NetBull Erfahrenes Mitglied

    coool..... .
     
  6. saftmeister

    saftmeister Nutze den Saft! Premium-User

    Ich denke eher, dass die meisten Hosting-Anbieter über Jahre hinweg nicht zu PHP7 wechseln oder es in abgeschlossenen Umgebungen anbieten werden.
     
  7. NetBull

    NetBull Erfahrenes Mitglied

    vermutlich....
     
  8. Chaosengel_Gabriel

    Chaosengel_Gabriel Erfahrenes Mitglied

    wird wida nen bissl umstellung, aber wird auch sicher nich schaden, wenn ich mir die Feature liste so anschau :D
     
  9. mermshaus

    mermshaus Erfahrenes Mitglied

    sheel gefällt das.
  10. sheel

    sheel I love Asm Administrator

    :D

    (Hab noch gar nicht mitbekommen, dass es seit 19 Tagen released ist :eek:)
     
  11. saftmeister

    saftmeister Nutze den Saft! Premium-User

    Ist doch unfassbar, wie lange es dauert, bis sich die Entwickler einer Software mal bewegen. Und dann nach Krücken suchen, anstatt sich auf den Hosenboden zu setzen und Hausaufgaben zu machen. ;)
     
  12. Jan-Frederik Stieler

    Jan-Frederik Stieler Monsterator Moderator

    Ähm, war das nicht klar das die MySQL Erweiterung mal rausfliegt?
    Also ich hab nur drauf gewartet.
     
  13. saftmeister

    saftmeister Nutze den Saft! Premium-User

    Es ist ja nicht so, dass mysqli sehr nah an der mysql-Erweiterung dran ist. Sich alle MySQL-Funktionen in der IDE suchen zu lassen und dann durch mysqli-Aufrufe auszutauschen ist ja nicht wirklich ein Problem.
     
  14. abuzze

    abuzze Erfahrenes Mitglied

    Bei meinem Hoster läuft PHP7 seit dem 4.12. :p
     
  15. sheel

    sheel I love Asm Administrator

    Ja, das war seit vielen Jahren schon klar, aber trotzdem gibts unzählige Leute die noch immer
    neuen Code damit geschrieben haben (statt gleich die zukunftssichere Variante zu nehmen)
    In den meisten Fällen nur, weil man daran schon gewöhnt war oder grad erst beim PHP-Lernen
    ist und dem erstbesten alten Tutorial im Netz zu viel geglaubt hat.
     
  16. mermshaus

    mermshaus Erfahrenes Mitglied

    Ja, bei geringerem Umfang des Codes und/oder wenigen Aufrufen ist eine Umstellung recht fix gemacht. Schwieriger wird es bei großen Projekten oder auch bei Fremdsoftware, die vom Anbieter nicht oder nicht mehr aktualisiert wird.

    Generell wird die – wahrscheinliche – anhaltende Nutzung der mysql-Erweiterung in aktuell installierten Webanwendungen wohl auch oft daran hängen, dass etliche Kunden selbst keine Entwickler sind und deshalb überhaupt keinen Bezug dazu haben, welche Features etwa einer Sprache wann als deprecated markiert oder sogar entfernt werden. Sie haben die Software einmal eingekauft oder schreiben lassen und seitdem verrichtet sie ihren Dienst und das Thema ist abgehakt. Software oder EDV-Systeme, die völlig ohne halbwegs regelmäßige Wartung auskommen, sind natürlich mehr oder weniger eine Illusion, aber ich finde die skizzierte Betrachtungsweise dennoch eigentlich gar nicht so verkehrt und würde mir wünschen, dass wir als Entwickler oder als Branche tatsächlich mehr so nachhaltig arbeiten würden, dass die Software auch in vielen Jahren noch lauffähig ist. Und das idealerweise dazu auch noch fehlerfrei. :)
     
  17. saftmeister

    saftmeister Nutze den Saft! Premium-User

    ComFreek, Bratkartoffel und sheel gefällt das.
  18. sheel

    sheel I love Asm Administrator

    :(
    Hab irgendwie nur drauf gewartet... Unkraut vergeht nicht
    Wenn wenigstens nicht schon beim ersten Blick Probleme erkennbar wären...
    (zB. das String-escapen)
     
  19. bofh1337

    bofh1337 Erfahrenes Mitglied

    (Short-)Tags wurden entfernt. Die Erkennung für die Tags <% und <script language="php"> wurde entfernt.

    HAHAHAAHA, unzählige Pfuscher werden an meine Worte von 2014 denken xD Hoffentlich ist dann auch sowas wie "<?=" als Tag ungültig
     
    Jan-Frederik Stieler und sheel gefällt das.
  20. mermshaus

    mermshaus Erfahrenes Mitglied

    Short-Tags im Sinne dieser Direktive bleiben von dem RFC explizit unberührt.

    Entfernt wurden mit Version 7 die ASP-ähnlichen Tags (<% … %>) und die HTML-script-Tags (<script language="php">…</script>).

    <?php und <?= sind – Stand jetzt (seit PHP 5.4.0) – immer verfügbar. Die Nutzung von <?= ist unproblematisch, und es deutet meines Wissens auch nichts darauf hin, dass sich daran was ändern könnte.

    <? hängt von der oben verlinkten Konfigurationseinstellung ab. Deshalb ist tendenziell eher von der Nutzung abzuraten, um diese Abhängigkeit zu umgehen. Der Gewinn von <? gegenüber <?php ist zudem meines Erachtens nicht gewaltig.

    Edit:

    Das Problem mit <? ist, dass es auch in "<?xml" auftritt, was zum Beispiel in HTML-Dateien mit XML-Prolog (also „echten“ XHTML-Dateien sozusagen) öfter mal fälschlicherweise den PHP-Parser angeworfen hat.

    Das Syntax-Highlighting des Forums demonstriert das freundlicherweise:

    (Also, das wäre der Inhalt einer index.php-Datei, wie er im Editor steht, also vor dem Ausführen von PHP.)

    PHP:
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    3.         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    4. <html xmlns="http://www.w3.org/1999/xhtml">
    Das hier war früher, als man manchmal noch XML-Prologe nutzte, ein übliches Pattern, um das zu umgehen:

    (So Pi mal Daumen jedenfalls. Ich kriege es nicht mehr genau auf die Reihe, weil es länger her ist.)

    PHP:
    1. <?php echo '<?xml version="1.0" encoding="utf-8"?>'; ?>
    2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    3.         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    4. <html xmlns="http://www.w3.org/1999/xhtml">
    Und beim „händischen“ Erstellen von tatsächlichen XML-Dateien mit PHP besteht das Problem natürlich noch immer.
     
    Zuletzt bearbeitet: 28. Mai 2016
Die Seite wird geladen...