Heim  >  Artikel  >  Backend-Entwicklung  >  PHP7 deklariert Skalartypen und erklärt die starke Typprüfung

PHP7 deklariert Skalartypen und erklärt die starke Typprüfung

韦小宝
韦小宝Original
2018-03-03 11:01:015483Durchsuche

PHP7 wurde bereits 2015 veröffentlicht und wird von immer mehr Menschen verwendet. In diesem Artikel werden wir darüber sprechen, wie PHP7 Skalartypen deklariert und wie PHP7 eine starke Typüberprüfung durchführt Kannst mal reinschauen!

Skalare Typdeklaration

PHP unterstützt seit PHP5.0 die Deklaration von Klassen- und Schnittstellenparametertypen. PHP5.1 unterstützt Array und PHP5.4 unterstützt Callable. Diese Typdeklarationen ermöglichen es PHP, während der Ausführung die richtigen Parameter zu übergeben, wodurch die Funktionssignatur informativer wird.

Ab PHP7 werden int, float, string und bool als Typdeklarationen erkannt und können für Funktionsrückgabewerttypen und Parametertypdeklarationen verwendet werden

<?php
function sum(int $a,int $b):string {
return $a+$b;
}
var_dump(sum(1,2));

Der obige Code wird normal ausgeführt
Das Ergebnis ist string(1) „3“. Wenn der Parameter im schwachen Typprüfungsmodus nicht mit dem deklarierten Typ übereinstimmt, wird er gemäß den PHP-Regeln konvertiert.

PHP7.1 fügt eine Deklaration hinzu Methode für nullfähige Typen und fügt void als Funktionsrückgabewerttyp hinzu. Im starken Typprüfungsmodus kann eine als void-Rückgabetyp definierte Funktion keinen Rückgabewert haben, selbst wenn sie null zurückgibt:

declare(strict_types=1);
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. Es kann nicht für die Parametertypdeklaration verwendet werden, da sonst ein Fehler ausgelöst wird:

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

Nullable-Typdeklaration

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

sind wie folgt:

function 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, was es bedeutet, den Typ des Funktionsparameters anzugeben oder Rückgabewert in der Form ? Entweder der angegebene Typ oder null.

Diese Methode kann auch zur Definition von Schnittstellenfunktionen verwendet werden:

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

Aber eines ist zu beachten: Wenn die Funktion selbst den Parametertyp definiert und keinen Standardwert hat, Auch wenn es nullbar ist, kann es nicht weggelassen werden, da sonst ein Fehler ausgelöst wird.

lautet wie folgt:

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

Aber wenn der Parameter der obigen -Funktion in der Form ?Bar $bar = null definiert ist, ist der dritte Weg von Schreiben ist auch machbar. Da = null tatsächlich einer Obermenge von ? entspricht, kann null als Standardwert für Parameter von Nullable-Typen festgelegt werden.

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

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
}
}

Strikter Überprüfungsmodus
strict_types/declare()-Direktive

Standardmäßig befinden sich alle PHP-Dateien im schwachen Typprüfungsmodus. Die neue Declare-Direktive gibt den Wert von strict_types an (1 oder 0). 1 gibt den strikten Typprüfungsmodus an, der für Funktionsaufrufe und Rückgabeanweisungen gilt.

declare(strict_types=1) muss die erste Anweisung der Datei sein. Wenn diese Anweisung an anderer Stelle in der Datei vorkommt, wird ein Kompilierungsfehler generiert und der Blockmodus wird ausdrücklich verboten.

Ähnlich wie die Encoding-Direktive, aber anders als die Ticks-Direktive, wirkt sich die strict_types-Direktive nur auf die angegebene Datei aus und hat keinen Einfluss auf andere darin enthaltene Dateien (durch include usw.). Diese Direktive wird zur Laufzeit kompiliert und kann nicht geändert werden. Die Funktionsweise besteht darin, ein Flag im Opcode zu setzen, damit Funktionsaufrufe und Rückgabetypprüfungen den Typeinschränkungen entsprechen.

<?php
declare(strict_types=1);
function sum(int $a,int $b):string {
return $a+$b;
}
var_dump(sum(1,2));

Der obige Code entspricht nicht der Typdeklaration des Rückgabewerts der Funktion und es wird ein TypeError ausgegeben.

<?php
declare(strict_types=1);
function sum(string $a,string $b):string {
return $a+$b;
}
var_dump(sum(1,2));

Der obige Code entspricht nicht zur Deklaration des Parametertyps der Funktion wird ebenfalls ein Fehler ausgegeben

Es gibt eine Ausnahme: Die Typkonvertierung „wide“ ermöglicht, dass int float wird, d. h. wenn der Parameter als deklariert ist Float-Typ, es kann weiterhin int-Parameter akzeptieren.

<?php
declare(strict_types=1);
function sum(int $a,int $b):float {
return $a+$b;
}
var_dump(sum(1,2));

Der obige Code wird normal ausgeführt

In diesem Szenario übergeben wir einen int-Parameter an die Funktion, die so definiert ist, dass sie Float akzeptiert, und dieser Parameter wird in Float konvertiert. Andere Konvertierungen sind nicht zulässig.

Verwandte Empfehlungen:

Einführung in die Leistung der PHP7.2-Version

Das obige ist der detaillierte Inhalt vonPHP7 deklariert Skalartypen und erklärt die starke Typprüfung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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