PHP 7 - Was ist neu?

PHP 7 - Was ist neu?

Vor kurzem wurde PHP 7.0.1 veröffentlicht (http://php.net/archive/2015.php#id2015-12-17-1), und für mich als Webentwickler ist dies Anlass genug um ein paar Zeilen über die Skriptsprache meiner Wahl zu verlieren. Installation Mein Webserver läuft mit Ubuntu 14.10, dort habe ich auch die aktuelle Version von PHP kompiliert (aber noch nicht im Einsatz, kommt aber noch). Für die Installation gibt es diverse Leitfäden, ich habe mich an den von Enrico Zimuel gehalten (http://www.zimuel.it/install-php-7/). Es sei gleich erwähnt dass ich einiges an Paketen nach installieren musste. Wenn dann alles geklappt hat sieht es dann so aus: php7-zsh Was ist neu? Bei einigen Neuerungen kann ich den Nutzen für mich noch nicht ganz sehen, der Großteil der Änderungen ist jedenfall sehr hilfreich.

Scalar Type Hinting

<?php
function cube(int $a): int {
    return $a * $a * $a;
}

echo cube(5); // liefert 125
echo cube('a'); // liefert einen Fehler

Zur Laufzeit überprüft PHP ob der gelieferte Wert dem deklarierten Typ entspricht. Hier gibt es die Möglichkeit eine schwache (mit declare(strict_types=0); , oder durch das Weglassen der Deklaration) oder eine strikte Überprüfung (mit declare(strict_types=1);) anzuwenden. Bei der schwachen Überprüfung wird versucht den retournierten Wert in den erwarteten Typ zu konvertieren.

Null Coalescing Operator

Ein einfaches Beispiel:

<?php
$id = isset($_GET['id']) ? $_GET['id'] : false;

In PHP 7 kann dies wie folgt notiert werden:

<?php
$id = $_GET['id'] ?? false;

Das ist wesentlich kürzer, und auch einfacher zu lesen. Coalescing kann auch "gechained" werden:

<?php
$id = $_GET['id'] ?? $_POST['id'] ?? false;

Spaceship Operator

Der Spacehip Operator (<=>) wird verwendet um zwei Werte miteinander zu vergleichen, als Rückgabewerte bekommt man -1, 0 oder 1:

<?php
echo 5 <=> 5; // 0
echo 5 <=> 6 // -1
echo 5 <=> 4 // 1

Das klappt auch bei Strings:

<?php
echo 'a' <=--> 'a'; // 0
echo 'a' <=> 'b' // -1
echo 'b' <=> 'a' // 1

Constant Arrays

Array constants können nun mit define() deklariert werden.

<?php
define('STEAKS',
    [
        'rib-eye',
        'club',
        'porterhouse',
       't-bone'
    ]
);

Anonymous Classes

Mit new class kann eine neue Klasse on-the-fly deklariert werden, ideal für Objekte die nicht mehrmals verwendet werden.

<?php
interface Logger {
    public function log(string $msg);
}

class Application {
    private $logger;

    public function getLogger(): Logger {
         return $this--->logger;
    }

    public function setLogger(Logger $logger) {
         $this->logger = $logger;
    }
}

$app = new Application;
$app->setLogger(new class implements Logger {
    public function log(string $msg) {
        echo $msg;
    }
});

var_dump($app->getLogger());

Dieses Skript liefert object(class@anonymous)#2 (0) { }

Unicode Codepoint Escape Syntax

Nimmt einen Unicode codepoint in hexadezimaler Notation und wandelt ihn in einen UTF-8-String um. Führende Nullen sind optional.

<?php
echo "u{aa}"; // unterstrichenes a
echo "u{0000aa}"; // wie oben nur mit führenden Nullen
echo "u{9999}";

So sieht das Ergebnis aus codepoint

Closure::call()

Closure:call() ist ein kürzerer und performanterer Weg um einen Object Scope an ein Closure zu hängen und einzubinden.

<?php
class A {
    private $x = 1;
}

// Pre PHP 7 code
$getXCallBack = function() {return $this--->x;};
$getX = $getXCallBack->bindTo(new A, 'A');
echo $getX();

// PHP 7+ code
$getX = function() {return $this->x;};
echo $getX->call(new A);

Filtered unserialize()

Sicherheitsverbesserung bei unserialize(). Der Entwickler kann nun angeben welche Objekte erlaubt sind.

<?php
$data = unserialize($foo, ["allowed_classes" =--> ["MyClass", "MyClass2"]]);

Group use Declarations

use Deklarationen können jetzt gruppiert werden

<?php
// Pre PHP 7 Code
use SomeNameSpaceClass1
use SomeNameSpaceClass2
use SomeNameSpaceClass3

// PHP 7+ Code
use SomeNameSpace{
    Class1,
    Class2,
    Class3
}

Integer division with intdiv()

Mit intdiv()wird eine Ganzzahldivision durchgeführt und das Ergebnis zurück gegeben.

<?php
var_dump(intdiv(10, 3)); // liefert int(3)

Cryptographically Secure Pseudo-Random Number Generator

Es gibt 2 neue Funktionen: string random_bytes ( int $length ) und int random_int ( int $min , int $max ) . Diese liefern kryptographisch sichere Zufallszeichenketten bzw. Zufallszahlen. Besonders bei der Erzeugung von kryptographsichen Schlüsseln oder auch bei Anwendungen wo echte Zufallszahlen benötigt werden (z.B. das Mischen eines Kartendecks) von Interesse.

Tagged with: