PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


PHP 7 Feature Freeze

with 2 comments

PHP 7 wird großartig, ich freue mich schon sehr darauf! Ich hoffe dass der straffe Zeitplan eingehalten werden kann, und wir im Oktober/November die Version 7.0 in den Händen halten.

Vor 2 Wochen war der Feature-Freeze, und alle Abstimmungen die noch liefen sind beendet, es stehen also nun mehr oder minder alle Features fest die drin sein werden. Im großen und ganzen wissen wir nun was uns in PHP 7 alles erwarten wird.

Hier stelle ich folgende Features von PHP 7 vor:

  1. Performance
  2. Skalare Typehints
  3. jsond
  4. Coalesce-Operator
  5. Engine-Exceptions
  6. Kontext-sensitiver Lexer
  7. Uniform Variable Syntax
  8. Abstract Syntax Tree
  9. Neue einheitliche Zufallsfunktionen
  10. weiteres

1. Performance

Für mich an erster Stelle steht wahrscheinlich die stark gestiegene Performance. In bisherigen Versionen wurde PHP „nur“ jeweils 5-10% schneller, was kontinuierlich auch ganz gut ist, aber PHP 7 setzt einen oben drauf. Wie bereits in anderen Blogartikeln (1 2 3) aufgezeigt werden wir ein zwischen 70% und 120% schnelleres PHP bekommen gegenüber PHP 5.6. Damit wird PHP 7 ungefähr  genauso schnell sein wie Facebooks HHVM. Geschenkte Performance ohne dass man seine Applikationen umbauen muss ist immer gern gesehen 😉

2. Skalare Typehints

Das nächste sehr interessante Feature werden die skalaren Typehints sein. Mit der Zeit werde ich diese sicherlich einsetzen in Projekten, in denen ich selbst die PHP-Version bestimmen kann und keine Rücksicht auf alte Systeme nehmen muss. Mit den Typehints stark verbunden sind auch die Return Types, man kann in Zukunft einer Funktion also einen Typ zuordnen die sie zurückzuliefern hat.
Die skalaren Typehints waren eine riesen Diskussion. Jeder will sie, aber man war sich nicht einige wie „stark“ sie sein sollen. Nun hat man sich auf einen Dual-Mode geeinigt, mit dem jeder hoffentlich halbwegs glücklich werden wird. Hierzu werde ich bald noch einen separaten Blogartikel verfassen, weil das ganze ein recht umfangreiches Thema ist.

3. jsond

PHP wird eine neue Implementation der JSON-Extension bekommen. Damit werden Lizenzprobleme gelöst, und die neue Variante ist in vielen Fällen (nicht allen) auch schneller, zwischen 20% und 250%. Das ganze passiert unter der Haube, der einzige Unterschied zu vorher ist, dass man json in Zukunft nicht mehr einzeln nachinstallieren muss bei den meisten Linux-Distributionen, sondern es fest eingebaut mitgeliefert wird.

4. Coalesce-Operator

Der sogenannte Coalesce-Operator könnte auch recht hilfreich sein, man wird sich sicher ein paar Wochen an das „Aussehen“ gewöhnen müssen, aber ich glaube er gefällt mir sehr gut:

// vorher:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
// mit PHP 7:
$username = $_GET['user'] ?? 'nobody';

5. Engine-Exceptions

Die Engine von PHP darf in Zukunft auch Exceptions werfen. Vorbei sind also die Zeiten von „Fatal errors“, zukünftig kann man diese Fehler abfangen und sie behandeln. Beispiel:

function call_method($obj) {
    $obj->method();
}
call_method(null); // oops!

Aktuell bricht der Code ab mit der Fehlermeldung:

Fatal error: Call to a member function method() on a non-object in /path/file.php on line 4

Fatale Fehler sind immer doof, denn evtl. wichtiger „Aufräumcode“ wird nicht mehr aufgerufen. Das kann böse enden.

Und so kann man in Zukunft diese Exception abfangen und darauf reagieren:

try {
    call_method(null); // oops!
} catch (EngineException $e) {
    echo "Exception: {$e->getMessage()}\n";
}

6. Kontext-sensitiver Lexer

In Zukunft wird es weniger reservierte Wörter für Funktionsnamen geben. Das ganze nennt sich kontext-sensitiver Lexer und bedeutet dass reservierte Wörter wie „for“ oder „list“ nicht mehr global verboten werden, sondern je nach Kontext des Gebrauchs erlaubt sein werden. Mit PHP 7 wird folgender Code möglich sein, der aktuell nicht erlaubt ist weil „for“, „and“, „or“, „list“ reserviert sind und nicht genutzt werden dürfen:

$projects = Finder::for('project')
        ->where('name')->like('%secret%')
        ->and('priority', '>', 9)
        ->or('code')->in(['4', '5', '7'])
        ->and()->not('created_at')->between([$time1, $time2])
        ->list($limit, $offset);

7. Uniform Variable Syntax

Durch die Uniform Variable Syntax wird man einige schöne neue Zeilen Code schreiben können, für die man bisher häufig temporäre Variablen brauchte. Einige Beispiele:

$foo()['bar']()
getStr(){0}
$foo->bar()::baz()
$foo->bar()()

8. Abstract Syntax Tree

Ein weiteres Feature unter der Haube von PHP 7 wird der Abstract Syntax Tree (AST) sein. Das Voting war mit 47:0 sehr eindeutig 😉 Bisher produziert der PHP-Parser direkt OpCodes. In Zukunft wird der Parser als Zwischenstruktur den AST generieren, der dann erstens einige schöne Optimierungen des Codes erlaubt, aber auch entkoppelt er damit den Parser vom Compiler, was die Wartung einfacher machen wird. Wenn der AST zugänglich gemacht wird für Userland/Extensions, dann wird man damit auch super Statische Analyzer bauen könne. Und nebenbei bringt er auch nochmal mehr Performance. Wir dürfen gespannt sein!

9. Neue einheitliche Zufallsfunktionen

PHP hat noch keinen einheitlichen Cryptographically secure pseudo-random number generator (CSPRNG), und wird nun einen bekommen. Kein Gehampel mehr mit openssl_random_pseudo_bytes(), mcrypt_create_iv() und /dev/urandom. Es hilft hoffentlich dabei, dass User bei kryptografischen Aufgaben nicht mehr auf rand() oder ähnliches zurückgreifen sondern die „richtige“ Funktion dafür nutzen: random_bytes() bzw. random_int().

10. weiteres

Zusätzlich zu den genannten Features gibt es noch eine Menge weiterer Änderungen: Spaceship-Operator, Generator Delegation, besserer 64bit Support, Verbieten von mehreren default-Blöcken, Gruppen-„use“-Deklarationen, und und und. Etwas aufpassen muss man bei den neuen reservierten Typen (int, float, bool, string, true, false, null), die nun nicht mehr als Klassennamen, Interfacenamen oder Namespacebezeichnungen genutzt werden würden.

Unter anderem werden auch einige alte Zöpfe abgeschnitten wie z.B. einige alte SAPIs und Extensions und die alten ASP tags (<%) und Script-Tags (<script language=php>) werden entfernt, alte PHP4-Konstruktoren werden entfernt, und noch mehr Extensions (ext/mysql, ext/ereg) und Funktionen die bereits als DEPRECATED markiert waren werden endlich rausgeschmissen. E_STRICT wird auch entfernt da es kaum genutzt wurde und wenig Sinn macht.

In PHP 7 wird man auch weiter weggehen von PEAR und Pecl, hin zu Composer und Pickle. Sich darauf vorzubereiten und daran zu gewöhnen ist sicher auch nicht verkehrt.

Fazit

In den nächsten Monaten ist Testen angesagt, je eher man sich mit den Änderungen befasst und seinen Code schonmal langsam auf PHP 7 vorbereitet, beispielsweise also von mysql_*-Funktionen befreit, umso stressfreier wird der Umstieg Ende des Jahres. Auf GitHub wird die aktuelle PHP 7 nightly Version bereits von Travis-CI unterstützt, man kann also bereits seinen Code dort testen lassen. Auch gibt es noch viel zu tun um alle benötigten PHP-Extensions für PHP 7 fertig zu machen, prüft also ob alle eure benötigen Extensions in der Liste sind, und helft im Idealfall dabei sie kompatibel zu machen!

Go, PHP 7!

Written by Michael Kliewe

April 2nd, 2015 at 10:58 am

Posted in PHP

Tagged with , , ,

2 Responses to 'PHP 7 Feature Freeze'

Subscribe to comments with RSS or TrackBack to 'PHP 7 Feature Freeze'.

  1. […] PHP 7-Version am 12. November 2015 veröffentlicht werden soll. Was alles neu in PHP 7 ist, wird in diesem Blogeintrag sehr schön […]

  2. Oh Mann, ich freu mich auch schon total über PHP 7 – gefühlt musste ich ewig und 5 Jahre darauf warten.

    Vor allem auf die Performance, jsond und den neuen RNG!

    Go,
    PHP7, aktuell neben C immer noch meine Lieblingssprache.

    Michael D.

    4 Jan 16 at 17:51

Leave a Reply

You can add images to your comment by clicking here.