Heim  >  Artikel  >  Backend-Entwicklung  >  Die neuen Funktionen von PHP 7.1 auf einen Blick

Die neuen Funktionen von PHP 7.1 auf einen Blick

黄舟
黄舟Original
2017-02-06 09:33:141519Durchsuche

Nullable-Typ

Nullable-Typ wird hauptsächlich für die Deklaration von Parametertypen und Funktionsrückgabewerten verwendet.

Die beiden Hauptformen sind wie folgt:

<?phpfunction answer(): ?int  {   return null; //ok}function answer(): ?int  {
   return 42; // ok}function say(?string $msg) {
   if ($msg) {
       echo $msg;
   }}

Anhand des Beispiels ist es leicht zu verstehen, dass die Form von ? verwendet wird, um den Typ der Funktion anzugeben Parameter oder Rückgabewert ist entweder ein angegebener Typ oder null.

Diese Methode kann auch zur Definition von Schnittstellenfunktionen verwendet werden:

<?php interface Fooable {    function foo(?Fooable $f);}

Aber eines ist zu beachten: Wenn die Funktion selbst den Parametertyp definiert und keinen hat Standardwert, auch wenn Es ist nullbar und kann nicht weggelassen werden, andernfalls wird ein Fehler ausgelöst. Wie folgt:

<?php function foo_nullable(?Bar $bar) {} foo_nullable(new Bar); // 可行foo_nullable(null); // 可行foo_nullable(); // 不可行

Aber wenn die Parameter der obigen Funktion in der Form ?Bar $bar = null definiert sind, ist auch die dritte Schreibweise möglich. Da = null tatsächlich einer Obermenge von ? entspricht, kann für nullfähige Typparameter null als Standardwert festgelegt werden.


Die eckige Klammerabkürzung von list

Wir wissen, dass Arrays vor PHP5.4 nur über array() definiert werden konnten, was der Fall war nach 5.4 hinzugefügt Vereinfachtes Schreiben von [] (es ist immer noch sehr praktisch, 5 Zeichen wegzulassen).

<?php // 5.4 之前$array = array(1, 2, 3);$array = array("a" => 1, "b" => 2, "c" => 3); // 5.4 及之后$array = [1, 2, 3];$array = ["a" => 1, "b" => 2, "c" => 3];

erstreckt sich auf eine andere Frage. Wenn wir den Wert des Arrays verschiedenen Variablen zuweisen möchten, können wir dies über die Liste tun:

<?php list($a, $b, $c) = $array;

Können wir auch [] übergeben? Wie lautet die Abkürzung für „implementieren“?

<?php [$a, $b, $c] = $array;

und der in der Liste angegebene Schlüssel, der in der nächsten Funktion erwähnt wird:

<?php ["a" => $a, "b" => $b, "c" => $c] = $array;

PHP7.1 implementiert diese Funktion. Es ist jedoch zu beachten, dass das im L-Wert angezeigte [] nicht die Abkürzung für Array, sondern die Abkürzung für List () ist.


Aber das ist noch nicht alles. Die neue list()-Implementierung kann nicht nur in lvalues ​​erscheinen, sondern auch in foreach-Schleifen verwendet werden:

<?php foreach ($points as ["x" => $x, "y" => $y]) {    
var_dump($x, $y);

Aufgrund von Implementierungsproblemen können list() und [] jedoch nicht ineinander verschachtelt verwendet werden:

<?php // 不合法
list([$a, $b], [$c, $d]) = [[1, 2], [3, 4]]; 
// 不合法
[list($a, $b), list($c, $d)] = [[1, 2], [3, 4]]; 
// 合法
[[$a, $b], [$c, $d]] = [[1, 2], [3, 4]];

Ermöglicht die Angabe des Schlüssels in der erwähnten Liste

Oben war ich hier, der Schlüssel kann in der neuen list()-Implementierung angegeben werden:

<?php $array = ["a" => 1, "b" => 2, "c" => 3];["a" => $a, "b" => $b, "c" => $c] = $array;

Dies entspricht:

<?php $a = $array[&#39;a&#39;];$b = $array[&#39;b&#39;];$c = $array[&#39;c&#39;];

Der Unterschied zur vorherigen list() ist Die Implementierung entspricht der Tatsache, dass der Schlüssel nur in der numerischen Form 0, 1, 2, 3 vorliegen kann und die Reihenfolge nicht angepasst werden kann. Wenn Sie die folgende Anweisung ausführen:

<?php list($a, $b) = [1 => &#39;1&#39;, 2 => &#39;2&#39;];

wird der Fehler PHP error: Undefinierter Offset: 0... angezeigt.

Die neue Implementierung kann die Zuweisung auf folgende Weise anpassen:

<?php list(1 => $a, 2 => $b) = [1 => &#39;1&#39;, 2 => &#39;2&#39;];

Im Gegensatz zu Arrays unterstützt die Liste keine gemischten Schlüssel. Die folgende Schreibmethode löst einen Parsing-Fehler aus:

<?php // Parse error: syntax error, ...list($unkeyed, "key" => $keyed) = $array;

Für komplexere Situationen unterstützt die Liste auch das Parsen zusammengesetzter Formen:

<?php $points = [    
["x" => 1, "y" => 2],    
["x" => 2, "y" => 1]]; 
list(list("x" => $x1, "y" => $y1), list("x" => $x2, "y" => $y2)) = $points; 
$points = [    
"first" => [1, 2],    
"second" => [2, 1]]; 
list("first" => list($x1, $y1), 
"second" => list($x2, $y2)) = $points;

und wird in Schleifen verwendet:

<?php $points = [    
["x" => 1, "y" => 2],    
["x" => 2, "y" => 1]]; 
foreach ($points as list("x" => $x, "y" => $y)) {    
echo "Point at ($x, $y)", PHP_EOL;}

void return Type

PHP7.0 hat die Funktion zur Angabe des Funktionsrückgabetyps hinzugefügt, aber der Rückgabetyp kann nicht als void angegeben werden. Diese Funktion von 7.1 ist eine Ergänzung:

<?php function should_return_nothing(): void {    return 1; // Fatal error: A void function must not return a value}

Es gelten beide folgenden Situationen Überprüfung:

<?php function lacks_return(): void {    // valid} function returns_nothing(): void {    return; // valid}

Eine als Rückgabetyp void definierte Funktion kann keinen Rückgabewert haben, auch wenn sie null zurückgibt:

<?php function returns_one(): void {    
return 1; // Fatal error: A void function must not return a value} 
function returns_null(): void {    
return null; // Fatal error: A void function must not return a value}

Darüber hinaus gilt void nur für Rückgabetypen und Es kann nicht für die Parametertypdeklaration verwendet werden, sonst wird ein Fehler ausgelöst:

<?php function foobar(void $foo) { // Fatal error: void cannot be used as a parameter type}

Die Rückgabetypdeklaration in einer Klassenfunktion kann nicht von einer Unterklasse überschrieben werden, andernfalls wird ein Fehler ausgelöst:

<?php class Foo{    
public function bar(): void {    
}
} 
class Foobar extends Foo{   
 public function bar(): array { // Fatal error: Declaration of Foobar::bar() must be compatible with Foo::bar(): void    }}

Festlegen von Konstantenattributen der Klasse

Diese Funktion ist relativ einfach zu sagen, das heißt, die Konstanten in der Klasse unterstützen jetzt öffentliche, private und geschützte Änderungen:

<?php class Token {    
// 常量默认为 
public    const PUBLIC_CONST = 0;     
// 可以自定义常量的可见范围    
private const PRIVATE_CONST = 0;    
protected const PROTECTED_CONST = 0;    
public const PUBLIC_CONST_TWO = 0;     
// 多个常量同时声明只能有一个属性    
private const FOO = 1, BAR = 2;}

Darüber hinaus können Konstanten in der Schnittstelle nur öffentliche Attribute sein:

<?php interface ICache {    public const PUBLIC = 0;    const IMPLICIT_PUBLIC = 1;}

Um den Änderungen gerecht zu werden, wurde die Implementierung der Reflexionsklasse entsprechend erweitert und zwei Methoden hinzugefügt , getReflectionConstant und getReflectionConstants, wurden hinzugefügt, um Konstanten zu erhalten:

<?php class testClass  {    
const TEST_CONST = &#39;test&#39;;
} 
$obj = new ReflectionClass( "testClass" );
$const = $obj->getReflectionConstant( "TEST_CONST" );
$consts = $obj->getReflectionConstants();

Multi-Bedingungs-Catch

In der vorherigen try...catch-Anweisung kann jeder Catch nur eines festlegen Bedingte Beurteilung:

<?php try {    
// Some code...
} 
catch (ExceptionType1 $e) {    
// 处理 ExceptionType1} 
catch (ExceptionType2 $e) {    
// 处理 ExceptionType2} 
catch (Exception $e) {    // ...}

In der neuen Implementierung können mehrere Bedingungen in einem Catch festgelegt werden, was der Formbeurteilung von oder entspricht:

<?php try {    
// Some code...} 
catch (ExceptionType1 | ExceptionType2 $e) {    
// 对于 ExceptionType1 和 ExceptionType2 的处理} 
catch (Exception $e) {    // ...}

Das Obige ist die Liste Weitere verwandte Inhalte finden Sie im PHP Chinese Net (www.php.cn)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn