Ein erster Blick in PHP 5.5

PHP 5.4 ist bereits seit einiger Zeit verfügbar und brachte seinerseits neue Features wie Traits, den integrierten Webserver sowie weitere Verbesserungen und Fixes mit.

Dieser Artikel wagt einen ersten Blick in die Features von PHP 5.5

Mit der Veröffentlichung der ersten Alpha-Version von PHP 5.5 werfen wir in diesem Artikel einen ersten Blick auf die neuen Features wie Generatoren, Password Hashing API und das neue Exception Schlüsselwort finally.

Generatoren

Neu in PHP 5.5 ist unter Anderem die Möglichkeit, Generatoren zu definieren. Generatoren stellen einen Weg zur Verfügung, Iteratoren einfach, schnell und bequem zu definieren. Einigen sind die Generatoren schon aus Sprachen wie Python bekannt.
Iteratoren gibt es aber natürlich schon seit PHP 5, jedoch nur mit einigem Overhead an Methoden, die implementiert werden müssen.

Die grundlegende Funktionsweise eines Generators ist wie folgt:

  • Ein Generator wird wie eine Funktion aufgerufen. Jedoch wird der Code innerhalb der Funktion erst dann ausgeführt, wenn darüber iteriert wird. Der Rückgabewert einer Generator-Funktion ist ein Objekt der Klasse Generator.
  • Über das neue Schlüsselwort yield wird ein Wert zurückgegeben.
  • Jede Generator-Funktion läuft solange, bis die Funktionslogik abgearbeitet wurde oder ein return-Statement diesen beendet.

Wie ein Generator funktioniert, soll das folgende Beispiel zeigen. Dort wird eine fibonacci-Funktion definiert, die schrittweise den aktuell errechneten Wert zurückliefert.
Dabei ist wichtig zu erwähnen, dass der enthaltene Code in dem Fall erst mit der Definition des foreach-Statements – also zum Zeitpunkt der Iteration – ausgeführt wird.

Beispiel-Aufruf anhand einer Fibonacci-Funktion:

function fibonacci($n) {
    $a = 0;
    $b = 1;
    $c = 0;

    while (true) {
        if ($c > $n) return;

        $s = $a + $b;
        $a = $b;
        $b = $s;
        yield $a;

        $c += 1;
    }
};

$f = fibonacci(8);
foreach ($f as $n) {
    echo $n . PHP_EOL;
}

Der Vorteil eines Generators ist auf dem ersten Blick aber nicht ganz einfach erkennbar. Generatoren machen vor Allem dann Sinn, wenn man über eine große Menge an Daten iterieren muss, die das Memory-Limit von PHP sprengen würden. Dies ist bspw. bei großen Arrays der Fall. Da Generatoren “zeilenweise” arbeiten, ist damit eine einfache Möglichkeit geschaffen, diesem Problem zu begegnen.

Password Hashing

Was PHP schon viel früher hätte einführen sollen, ist eine bereits durch die Sprache gegebene Möglichkeit, sichere Passwörter zu erstellen und auch zu validieren. Viele Webanwendungen heutzutage verschlüsseln kritische Daten mit Algorithmen wie MD5 oder SHA. Vor allem heutige GPU’s sind aber bereits in der Lage, mehrere Millionen Hashes pro Sekunde zu generieren.

Die neue Password Hashing API verwendet zum hashen jedoch den bcrypt-Algorithmus, der absichtlich langsam ist. Dadurch ist es auch für heutige GPU’s sehr aufwändig, diese Hashes zu berechnen. Diese schaffen kaum mehr als 500 Hashes pro Sekunde.

Die Anwendung der neuen Funktionen sind auch denkbar einfach. Man hat ein Passwort, das man hashen möchte. Dazu stellt PHP die Funktion password_hash bereit.

Beispiel-Aufruf:

$hash = password_hash($input, PASSWORD_BCRYPT, array(
    'cost' => 8,
    'salt' => ‘BCryptRequires22Chrcts’,
));

Die erwarteten Parameter sind:

  • Der Input
  • Verschlüsselungsalgorithmus
  • weitere Optionsn (bspw. die Angabe eines Salts. Dieser muss mindestens 22 Zeichen lang sein)

Um den verschlüsselten Hash anschließend zu validieren, bietet PHP 5.5 die Methode password_verify.

Beispiel-Aufruf:

$result = password_verify($password, $hash);

Damit stellt PHP 5.5 nun einen einfachen Weg bereit, einfach und unkompliziert sichere Passwort-Hashes zu generieren. Wahlweise auch gleich mit einem benutzerdefinierten Salt.

Finally

Das finally-Schlüsselwort stellt sicher, dass der dort enthaltene Code in jedem Fall ausgeführt werden. Unabhängig davon, ob eine Exception geworfen wurde oder nicht.

finally wird folgendermaßen verwendet:

class A
{

    public function foo()
    {
        try {
            echo 'TRY' . PHP_EOL;
            return;
        } catch (Exception $e) {
            echo 'CATCH' . PHP_EOL;
        } finally {
            echo 'FINALLY' . PHP_EOL;
        }

        echo 'AFTER TRY CATCH' . PHP_EOL;
    }

}
$a = new A();
$a->foo();

Wenn keine Exception geworfen wird, erzeugt das oben genannte Beispiel folgende Ausgabe:

TRY
FINALLY

Wird eine Exception geworfen, würde in dem Fall ebenfalls der Finally-Block ausgeführt werden.

Da try- und catch-Blöcke return;-Statements ausführen dürfen, würde der Code nach dem Exceptionhandling nicht mehr ausgeführt werden. finally stellt in diesem Fall also sicher, dass der enthaltene Code in jedem Fall ausgeführt wird, nachdem der jeweiligen try- oder catch-Block verlassen wird.

Weitere Neuheiten

Mit PHP 5.5 geht ist die Liste an Neuerungen natürlich noch nicht zu Ende. Unter anderem neu ist die Möglichkeit, list() nun in foreach zu verwenden. Bisher ging das nur innerhalb des foreach-Blocks. Des Weiteren lassen sich nun function returns auf die empty()-Funktion anwenden.

Fazit

Auch mit PHP 5.5 wird sich PHP wieder ein Stück weiter entwickeln und verbessern. Die neuen Features dürften so manche erfreuen, die bereits seit Langem darauf warten, bspw. die Generatoren einzusetzen, die bereits aus anderen Sprachen bekannt sind.

Mit der Veröffentlichung der ersten Alpha-Version wurde nun der Release-Zyklus markiert und die erste stabile Version ist wohl Mitte kommenden Jahres zu erwarten.

Ein Kommentar

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert