## Neue Features

### Konstante Ausdrücke

Es ist nun möglich einen skalaren Ausdruck mit numerischen oder String-Literalen und/oder Konstanten in Kontexten zu verwenden, in denen PHP bisher einen statischen Wert erwartete, beispielsweise Deklarationen von Konstanten und Eigenschaften und Standardwerte von Funktionsparametern.

`<?php
const ONE = 1;
const TWO = ONE * 2;
class C {
const THREE = TWO + 1;
const ONE_THIRD = ONE / self::THREE;
const SENTENCE = 'Der Wert von THREE ist '.self::THREE;
public function f($a = ONE + self::THREE) {
return $a;
}
}
echo (new C)->f()."\n";
echo C::SENTENCE;
?>`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    4
    Der Wert von THREE ist 3

Es ist nun auch möglich, ein konstantes Array mit dem Schlüsselwort `const` zu definieren:

`<?php
const ARR = ['a', 'b'];
echo ARR[0];
?>`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    a

### Variadische Funktionen mit `...`

Variadische Funktionen können nun mit dem Operator `...` implementiert werden, anstatt func_get_args() zu verwenden.

`<?php
function f($req, $opt = null, ...$params) {
// $params ist ein Array welches die übrigen Parameter enthält.
printf('$req: %d; $opt: %d; Anzahl Parameter: %d'."\n",
$req, $opt, count($params));
}
f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
?>`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    $req: 1; $opt: 0; Anzahl Parameter: 0
    $req: 1; $opt: 2; Anzahl Parameter: 0
    $req: 1; $opt: 2; Anzahl Parameter: 1
    $req: 1; $opt: 2; Anzahl Parameter: 2
    $req: 1; $opt: 2; Anzahl Parameter: 3

### Entpacken von Argumenten mit `...`

Arrays und Traversable-Objekte können in eine Liste von Parametern entpackt werden, indem der `...` Operator verwendet wird. Dies ist in anderen Sprachen, wie beispielsweise Ruby, auch als Splat-Operator bekannt.

`<?php
function add($a, $b, $c) {
return $a + $b + $c;
}
$operators = [2, 3];
echo add(1, ...$operators);
?>`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    6

### Potenzieren mit `**`

Der rechtsassoziative Operator `**` zum Potenzieren wurde gemeinsam mit dem abkürzenden Zuweisungsoperator `**=` hinzugefügt.

`<?php
printf("2 ** 3 == %d\n", 2 ** 3);
printf("2 ** 3 ** 2 == %d\n", 2 ** 3 ** 2);
$a = 2;
$a **= 3;
printf("a == %d\n", $a);
?>`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    2 ** 3 ==      8
    2 ** 3 ** 2 == 512
    a ==           8

### `use function` und `use const`

Der Operator `use` wurde um das Importieren von Funktionen und Konstanten zusätzlich zu Klassen erweitert. Dies kann jeweils entsprechend durch die Konstrukte `use function` bzw. `use const` erreicht werden.

`<?php
namespace Name\Space {
const FOO = 42;
function f() { echo __FUNCTION__."\n"; }
}
namespace {
use const Name\Space\FOO;
use function Name\Space\f;
echo FOO."\n";
f();
}
?>`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    42
    Name\Space\f

### phpdbg

PHP enthält nun einen interaktiven Debugger namens phpdbg, welcher als SAPI-Modul umgesetzt wurde. Weitere Informationen findet man in der phpdbg-Dokumentation.

### Standardzeichencodierung

default_charset wird nun als Standardzeichenkodierung für die Funktionen htmlentities(), html_entity_decode() und htmlspecialchars() herangezogen. Falls die (nun missbilligten) Einstellungen für die Zeichenkodierung von iconv und mbstring gesetzt sind, haben diese Vorrang gegenüber default_charset für die iconv beziehungsweise mbstring Funktionen.

Die Standardeinstellung hierfür ist `UTF-8`.

### `php://input` ist wiederverwendbar

`php://input` kann nun so oft wie nötig geöffnet und ausgelesen werden. Diese Änderung hat auch zu einer erheblichen Reduktion im Speicherverbrauch bei der Verarbeitung von POST-Daten geführt.

### Große Dateiuploads

Es werden nun auch Dateien mit einer Größe von mehr als zwei Gigabyte angenommen.

### GMP unterstützt Operatorüberladung

GMP-Objekte unterstützen nun Operatorüberladung und das Casten zu skalaren Typen. Dies erlaubt besser lesbaren Code bei Verwendung von GMP:

`<?php
$a = gmp_init(42);
$b = gmp_init(17);
if (version_compare(PHP_VERSION, '5.6', '<')) {
echo gmp_intval(gmp_add($a, $b)), PHP_EOL;
echo gmp_intval(gmp_add($a, 17)), PHP_EOL;
echo gmp_intval(gmp_add(42, $b)), PHP_EOL;
} else {
echo $a + $b, PHP_EOL;
echo $a + 17, PHP_EOL;
echo 42 + $b, PHP_EOL;
}
?>`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    59
    59
    59

### hash_equals() für Stringvergleiche mit Schutz gegen Rechenzeitangriffe

Die Funktion hash_equals() wurde hinzugefügt, welche zwei Zeichenketten in konstanter Zeit vergleicht. Dies sollte verwendet werden, um Rechenzeitangriffe zu verhindern, beispielsweise wenn crypt()-Passworthashes geprüft werden (unter der Annahme, dass password_hash() und password_verify() nicht verwendet werden können, welche gegen Rechenzeitangriffe nicht anfällig sind).

`<?php
$expected = crypt('12345', '$2a$07$benutzeeinenlangenstringalssalt$');
$correct = crypt('12345', '$2a$07$benutzeeinenlangenstringalssalt$');
$incorrect = crypt('1234', '$2a$07$benutzeeinenlangenstringalssalt$');
var_dump(hash_equals($expected, $correct));
var_dump(hash_equals($expected, $incorrect));
?>`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    bool(true)
    bool(false)

### `__debugInfo()`

Die magische Methode __debugInfo() wurde hinzugefügt, welche es Objekten erlaubt, die Eigenschaften und Werte zu bestimmen, welche bei Verwendung von var_dump() ausgegeben werden.

`<?php
class C {
private $prop;
public function __construct($val) {
$this->prop = $val;
}
public function __debugInfo() {
return [
'propSquared' => $this->prop ** 2,
];
}
}
var_dump(new C(42));
?>`

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

    object(C)#1 (1) {
      ["propSquared"]=>
      int(1764)
    }

### gost-crypto Hashalgorithmus

Der Hashalgorithmus `gost-crypto` wurde hinzugefügt. Dieser implementiert die GOST-Hash-Funktion unter Verwendung der CryptoPro S-box Tabellen wie in » RFC 4357, Abschnitt 11.2 spezifiziert.

### SSL/TLS-Verbesserungen

Eine große Zahl an Verbesserungen an der SSL/TLS-Unterstützung wurden in PHP 5.6 vorgenommen. Dies umfasst die standardmäßige Aktivierung von Peer-Verifikation, Unterstützung von Zertifikat-Fingerabdrucksprüfung, Verhinderung von TLS-Renegotiation-Attacken und viele neue SSL Kontextoptionen, welche eine detailliertere Kontrolle über Protokoll- und Verifikationseinstellungen bei Verwendung von verschlüsselten Streams erlauben.

Diese Änderungen werden im Abschnitt OpenSSL Änderungen in PHP 5.6.x dieser Migrationsanleitung detaillierter beschrieben.

### Unterstützung für pgsql async

Die Extension pgsql unterstützt nun asynchrone Verbindungen und Abfragen, womit nicht blockierendes Verhalten bei der Interaktion mit PostgreSQL-Datenbanken ermöglicht wird. Asynchrone Verbindungen können mittels der Konstante `PGSQL_CONNECT_ASYNC` aufgebaut werden, und die neuen Funktionen pg_connect_poll(), pg_socket(), pg_consume_input() und pg_flush() behandeln asynchrone Verbindungen und Abfragen.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open