Die neuen Funktionen von PHP 7.1 auf einen Blick

黄舟
Freigeben: 2023-03-05 12:10:01
Original
1535 Leute haben es durchsucht

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;
   }}
Nach dem Login kopieren

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);}
Nach dem Login kopieren

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(); // 不可行
Nach dem Login kopieren

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];
Nach dem Login kopieren

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;
Nach dem Login kopieren

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

<?php [$a, $b, $c] = $array;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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);
Nach dem Login kopieren

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]];
Nach dem Login kopieren

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;
Nach dem Login kopieren

Dies entspricht:

<?php $a = $array[&#39;a&#39;];$b = $array[&#39;b&#39;];$c = $array[&#39;c&#39;];
Nach dem Login kopieren

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;];
Nach dem Login kopieren

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;];
Nach dem Login kopieren

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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;}
Nach dem Login kopieren

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}
Nach dem Login kopieren

Es gelten beide folgenden Situationen Überprüfung:

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

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}
Nach dem Login kopieren

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}
Nach dem Login kopieren

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    }}
Nach dem Login kopieren

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;}
Nach dem Login kopieren

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

<?php interface ICache {    public const PUBLIC = 0;    const IMPLICIT_PUBLIC = 1;}
Nach dem Login kopieren

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();
Nach dem Login kopieren

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) {    // ...}
Nach dem Login kopieren

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) {    // ...}
Nach dem Login kopieren

Das Obige ist die Liste Weitere verwandte Inhalte finden Sie im PHP Chinese Net (m.sbmmt.com)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage