Open Source im professionellen Einsatz
Linux-Magazin 01/2016
© Sergey Nivens, 123RF

© Sergey Nivens, 123RF

PHP 7 mit neuen Features

Weiche Landung

Mit PHP 7 beschleunigt der User seine Anwendungen bis auf doppelte Geschwindigkeit zur Vorgängerversion. Der neue Schwung reißt aber auch einige Entwickler mit ins kalte Wasser – sie müssen ihre PHP-5-Skripte anpassen. Der Artikel beschreibt die wichtigsten Änderungen.

933

Zu Redaktionsschluss stand PHP 7 [1] kurz vor der Fertigstellung und sollte beim Erscheinen dieses Heftes bereits in der finalen Version zugänglich sein. Neben der konsistenten 64-Bit-Unterstützung bietet die neue Major-Release der Skriptsprache unter anderem Aufräumarbeiten bei einer Vielzahl unschöner Dinge. Die Installation des RC3 beschreibt der Kasten "PHP 7 auf die Platte".

PHP 7 auf die Platte

Eine Vorabversion von PHP 7 erhält der Anwender unter Debian 8 durch Eingabe der Befehle aus Listing 1. Mit ihnen lädt er die Vorabversion aus dem Internet und installiert sie – unterstützt von den Kommandozeilenschaltern »--prefix« und »--with-config-file-path« – in sein Homeverzeichnis.

Anschließend ergänzt er den Ausdruck »export PATH=$PATH:$HOME/php7-RC03/usr/bin« am Ende der Datei »~/.bashrc« und legt zudem einen symbolischen Link auf das PHP-Binary (»cd ~/php7-RC03/usr/bin/ && ln -s php php7« ), um PHP 7 nach einem Neustart der Shell über die Eingabe von »php7« aufzurufen (Abbildung 1).

Listing 1

PHP 7 unter Debian 8

01 apt-get install autoconf libxml2-dev
02 wget -O- https://downloads.php.net/~ab/php-7.0.0RC3.tar.gz
03 tar xzvf php-7.0.0RC3.tar
04 cd php-7.0.0RC3
05 ./buildconf --force
06 ./configure --prefix=$HOME/php7-RC03/usr --with-config-file-path=$HOME/php7-RC03/usr/etc
07 make
08 make install

Vergangenheitsbewältigung

Die Ausdrucksstärke ihrer sprachlichen Mittel steigern die PHP-7-Entwickler, indem sie historisch gewachsene Unschönheiten bereinigen – auf Kosten mangelnder Rückwärtskompatibilität. Schuld an den Unannehmlichkeiten sind aber nicht unbedingt die kleineren Änderungen. So erlaubt PHP 7 zwar nur noch eine Default-Klausel pro Switch-Anweisung und verbietet gleichnamige Funktionsparameter wie in »function foo($value, $ignored, $ignored)« , doch waren solche Ausdrücke für PHP-Anwender ohnehin schon immer tabu. Ebenso empfahlen die PHP-Macher ihren Nutzern bereits vor dem Erscheinen von PHP 7, auf die Schlüsselworte »bool« , »int« , »float« , »string« , »null« , »true« und »false« als Namen für Klassen, Traits und Interfaces zu verzichten.

Abbildung 1: PHP 7 lässt sich in Debian 8 recht einfach installieren und startklar machen.

Gegen ASP-Tags wie etwa »<% [...] %>« , »<= [...] =>« und »<script language="php"> [...] </script>« , mit denen Entwickler üblicherweise PHP-Code eingrenzen, gab es hingegen ursprünglich keine Vorbehalte. Dennoch muss sich auf Arbeit einstellen, wer auf sie gesetzt hat, und diese Tags nach dem Releasewechsel adäquat mit »<?php [...] >« austauschen.

Daneben wirft PHP 7 nun zum Beispiel Exceptions und löst zugleich das Fehlerniveau »E_STRICT« komplett auf. Indem es aber eine Vielzahl von Fehlermeldungen artikuliert, reagieren PHP-5-Anwendungen unter PHP 7 womöglich vollkommen anders als erwartet. Das gilt insbesondere für Anwendungen, die eigene Fehler-Handler einsetzen. Entwickler müssen in solchen Fällen notgedrungen den Quellcode durchforsten.

Klärungsprozess

Auch wer indirekte Variablen verwendet, muss seinen Code wohl in jedem Fall überarbeiten, denn den Ausdruck »$$foo['ref']« wertet PHP 5 noch sinngemäß wie den Pseudoausdruck »$($foo['ref'])« aus. PHP 7 interpretiert ihn hingegen ungefähr als »$($foo)['ref']« , denn in der neuen Major-Release wirkt der Dereferenzierungsoperator »$« strikt von links nach rechts (Abbildung 2). Dadurch gibt Zeile 5 von Listing 2 die Zeichenkette »foo« aus.

Listing 2

Indirekte Variablen expandieren

01 <?php
02 $foo = 'bar';
03 $bar = ['ref' => 'foo'];
04
05 echo $$foo['ref'];
06 echo ${$bar['ref']};
07 ?>
Abbildung 2: In Listing 2 schraubt PHP 7 das Wort foobar zusammen.

Wer geschweifte Klammern verwendet, kann die Expansion steuern und durch kluge Wahl das Verhalten von PHP 5 wiederherstellen, wie es die letzte Zeile des Listings tut. Zeile 6 liefert die Zeichenkette »bar« zurück. Wer die Listings in PHP 7 ausführen möchte, muss den Code jeweils mit den Begrenzern »<?php [...] ?>« umgeben. Andernfalls erkennt PHP ihn nicht und zeigt lediglich den Quellcode an.

Auch die Foreach-Schleife behandelt Variablen unter PHP 7 etwas anders. Iteriert die Skriptsprache über ein Feld, wirken sich Änderungen für das Feld, die von Code innerhalb des Schleifenkörpers stammen, nicht unbedingt aus (Listing 3). Denn PHP 7 iteriert in der Schleife über eine Kopie des Feldes »$arr« aus Zeile 2. Löscht das Skript also das zweite Feldelement mittels »unset($arr[1])« (Zeile 6) hat das keinen Effekt. Das Skript gibt die Werte »1« , »2« und »3« in der Shell aus (Abbildung 3, links).

Listing 3

Iterationen bleiben unbeschädigt

01 <?php
02 $arr = [1,2,3];
03
04 foreach ($arr as $val) {
05     echo $val;
06     unset($arr[1]);
07 }
08 ?>
Abbildung 3: Der Vorher-Nachher-Vergleich: Das &-Zeichen sorgt für zwei unterschiedliche Ausgaben.

Wie schon zuvor lässt sich die Rückwärtskompatibilität zu PHP 5 restaurieren. Soll der Code direkt über das Feld aus Zeile 2 iterieren, fügt der Entwickler im Schleifenkopf den Referenzoperator »&« vor der Laufvariablen »var« ein:

foreach ($arr as &$var)

Im Ergebnis zeigt PHP 7 die Werte »1« und »3« an (Abbildung 3, rechts). Anders als PHP 5 erhöht die neue Version den Feldzeiger von einer Foreach-Schleife nicht, weswegen der Aufruf der Funktion »current()« stets den gleichen Wert ausgibt.

Mit dem Indizieren von Feldern haben die Entwickler eine prominente Nebenwirkung beseitigt. Die Ordnung eines Feldes bleibt unter PHP 7 auch dann literal, wenn das Skript ein Feld über eine Referenz mit dem Wert eines folgenden Schlüssel-Wert-Paares verknüpft (Listing 4, Zeile 3). Die letzte Zeile würde »a« und »b« in der Ausgabe »array(2) {["a"]=>&int(0)["b"]=>&int(0)}« unter PHP 5 vertauschen.

Listing 4

Die Ordnung ist rein literal

01 <?php
02 $arr = [];
03 $arr['a'] = & $arr['b'];
04 $arr['b'] = 0;
05
06 var_dump($arr);
07 ?>

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Pony

    Die statisch getypte und objektorientierte Programmiersprache Pony trabt auf eher abseitigen Pfaden, um mit sicherem und hochperformantem Code für nebenläufige Anwendungen ihre Fans zu beglücken.

  • ECMA-Script 6

    Der kommende Sprachstandard ECMA-Script 6 beseitigt viele historische Javascript-Eigenheiten. Die bisher vermissten Klassen, Module und Default-Parameter erleichtern das Coden vor allem den Umsteigern von anderen Programmiersprachen.

  • React

    Vom Unternehmen Facebook kommt das quelloffene Javascript-Framework React, das Weboberflächen geschickt mit Datenschätzen verknüpft. Insbesondere die Renderfunktion macht sich dabei nützlich.

  • Squirrel

    Wer eine Skriptsprache mit schlankem Interpreter sucht, der sich möglichst einfach in Anwendungen einbetten lässt, greift schon fast blind zu Lua. In deren Schatten wartet jedoch schon länger ein praxiserprobter Konkurrent namens Squirrel. Dieser Artikel stellt die Open-Source-Sprache in einem Crashkurs vor.

  • Node.js und Redis

    Javascript auch auf dem Server nutzen, das verspricht das Webserver-Framework Node.js und bietet zahlreichen Erweiterungen und viele Funktionen, aber auch hohe Performance. Dieser Artikel zeigt, wie sich im Verbund mit der Datenbank Redis eine einfache und schnelle Buchungsapplikation entwickeln lässt.

comments powered by Disqus

Stellenmarkt

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.