Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung der PHP-Funktionstypdeklaration

Zusammenfassung der PHP-Funktionstypdeklaration

藏色散人
藏色散人nach vorne
2019-11-11 13:47:383308Durchsuche

PHP7 beginnt, die skalare Typdeklaration zu unterstützen, und die Variante stark typisierter Sprache ist relativ stark ausgeprägt. Bei der Verwendung dieser Funktion bin ich auf zwei Fallstricke gestoßen: einmal bei der Deklaration von Parametern vom booleschen Typ und zuletzt bei der Deklaration von Parametern vom doppelten Typ, die beide zu Laufzeitfehlern führten. Um in Zukunft ähnliche Fehler zu vermeiden, habe ich in den letzten Tagen die offiziellen Dokumente gelesen. Dieser Artikel ist eine Zusammenfassung der Verwendung von Typdeklarationen in PHP-Funktionen nach dem Lesen.

Syntaktisch hat die PHP-Funktionsdefinition mehrere Perioden durchlaufen:

Antike (PHP 4)

Es ist sehr einfach, eine Funktion zu definieren. Verwenden Sie die Syntaxdeklaration von Funktionsname(args) {body}. Parameter- und Rückgabewerttypen können nicht angegeben werden, und es gibt eine unbegrenzte Anzahl möglicher Parameter- und Rückgabewerttypen. Dies ist bei weitem die gebräuchlichste Art, eine Funktion zu deklarieren.

Array- und Referenztyp-Parameterwertdeklaration (PHP 5)

Array, Klasse, Schnittstelle und Callable können in der Funktionsdeklaration verwendet werden. Ab 5.6 werden Konstanten (einschließlich Klassenkonstanten) als Standardparameter sowie Parameterarrays (mit vorangestellten Auslassungspunkten...) unterstützt. Beispiel:

function sum(...$numbers) {
    $sum = 0;
    foreach ($numbers as $number) {
        $sum += $number;
    }
    return $sum;
}

Hinweis: Wenn der Wert des Parameters null sein kann, muss null der Standardwert des Parameters sein, sonst tritt beim Aufruf ein Fehler auf. Zum Beispiel:

function foo(array $arr = null) {
    ...
}

Skalare Typ- und Rückgabewertdeklaration (PHP 7)

Funktionen unterstützen offiziell Skalartypen (int, bool, float, string) und Rückgabewerttypen (Der deklarierbare Typ ist derselbe wie der Parameter) Deklaration. Ab dieser Version können Funktionsdeklarationen, abgesehen von Syntaxunterschieden, formal wie stark typisierte Sprachen erstellt werden.

Wenn der Rückgabewert der Funktion möglicherweise null ist, kann der Rückgabewerttyp leider nicht angegeben werden. Zum Beispiel:

function getModel() : Foo {
    if ($this->_model === null) {
         $this->_model = xxxx;  // get from db or otherelse
    }
    return $this->_model;     // 如果$this->_model仍是null,运行出错
}

Parameter und Rückgabewerte können null sein und die Rückgabetypdeklaration ist ungültig (PHP 7.1)

Wenn die Parameter- und Rückgabewerttypen null sein können, wird dem Typ Folgendes vorangestellt Eine Fragezeichen-Änderung (?) kann das Problem von Nullwerten lösen (steht nicht in Konflikt mit Standardparametern); die Typdeklaration fügt iterierbare Werte hinzu und unterstützt auch Rückgabewerte vom Typ „void“. Zum Beispiel:

function getModel(?int $id) : ?Foo {
    if ($id !== null) {
        $this->_model = xxxx;
    } else {
        $this->_model = yyyy;
    }
    return $this->_model;
}
// 调用
$foo->getModel(null);
$foo->getModel(100);
// 函数声明了参数并且没有提供默认参数,调用时不传入参数会引发错误
// 将函数声明改成 getModel(?int $id = 100) {},可以不传参数
$foo->getModel();

Wenn der Rückgabewert der Funktion void ist, kann der Funktionskörper nichts zurückgeben (die Schreibweise return void; ist ebenfalls falsch!), oder die return-Anweisung kann weggelassen werden.

function test(array $arr) : void {
    if (!count($arr) {
        return;
    }
    // 不要return;
    array_walk($arr, function ($elem) {xxxx});
}

Wenn wir auf die oben genannten historischen Änderungen zurückblicken, können wir sehen, dass die Funktionstypdeklaration in PHP 7.1 sehr vollständig war (obwohl sie in der Praxis nicht oft verwendet wird). Beachten Sie, dass es in dem Artikel um Parameter- und Rückgabewerttypdeklarationen geht. PHP garantiert nicht, dass die Parametertypen während des Betriebs unverändert bleiben. Das heißt, der folgende Code ist zulässig:

function foo(array $arr) : array {
    // change $arr from array to int
    $arr = 3;
    return [];
}

Aus dieser Sicht ist PHP dies Da es sich immer noch um eine schwach typisierte Sprache handelt, kann keine statische Kompilierung durchgeführt werden.

Lassen Sie uns über die Fallstricke in der Praxis sprechen. Laut offizieller Dokumentation sind die verfügbaren Typen für Funktionsparameter- und Rückgabewerttypdeklarationen:

● Klasse/Schnittstelle

● self, das nur in seinen eigenen Methoden verwendet werden kann

● Array

● Bool

● Callable

● Int

● Float

● String

● iterierbar

● void (wird nur für Rückgabewert verwendet)

Beachten Sie, dass die Liste keine booleschen und doppelten Typen enthält! Sofern Sie diese beiden Typen nicht definieren, ist es falsch, sie in Parametern und Rückgabewerten zu verwenden!

Hier ist PHP auch etwas schmerzhaft. Die beiden Schlüsselwörter double und float sind im normalen Gebrauch nahezu identisch. Doubleval ist beispielsweise ein Alias ​​von floatval, is_double ist ein Alias ​​von is_float und (double) und (float) haben bei der Konvertierung die gleiche Wirkung. Bei der Verwendung in Typdeklarationen ist es jedoch anders. Die gleiche Situation tritt bei bool und boolean auf.

Zusammenfassung

Derzeit ist die stabile Version von PHP 7.2 veröffentlicht. Es wird empfohlen, in neuen Projekten so oft wie möglich PHP 7.1 und nachfolgende Versionen zu verwenden. Um klaren und wartbaren Code zu schreiben, werden deklarative Typen empfohlen. Es wird empfohlen, Nullwerte nur für Referenztypen oder Zeichenfolgen zu verwenden und Nullwerte nicht für Skalartypparameter wie int/float zu verwenden. Versuchen Sie, func_get_argc und andere Funktionen nicht zu verwenden, es sei denn, dies ist erforderlich.

Das obige ist der detaillierte Inhalt vonZusammenfassung der PHP-Funktionstypdeklaration. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen