Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erläuterung der Funktionstypdeklarationen in verschiedenen PHP-Versionen

Detaillierte Erläuterung der Funktionstypdeklarationen in verschiedenen PHP-Versionen

小云云
小云云Original
2018-01-15 10:00:081758Durchsuche

Dieser Artikel gibt Ihnen hauptsächlich eine Zusammenfassung der Verwendung von Funktionstypdeklarationen in verschiedenen Versionen von PHP. Ich hoffe, dass er Ihnen helfen kann.

PHP7 beginnt, die skalare Typdeklaration zu unterstützen, und der Geschmack stark typisierter Sprache ist relativ stark. Bei der Verwendung dieser Funktion bin ich auf zwei Fallstricke gestoßen: einmal bei der Deklaration von boolean und zuletzt bei der Deklaration von double. Um in Zukunft ähnliche Fehler zu vermeiden, habe ich einmal die offizielle Dokumentation 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. deklariert mit der Syntax 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 usw.) und die Deklaration des Rückgabewerttyps (der deklarierte Typ ist derselbe wie der Parameter). Ab dieser Version fühlt sich das Schreiben von PHP wie das Schreiben von Java an.

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 sowohl null als auch void-Rückgabetypdeklarationen sein (PHP 7.1)

Wenn Parameter und Rückgabewerttypen sind möglich. Wenn es null ist, ändern Sie es mit einem Fragezeichen (?) vor dem Typ, wodurch das Problem des Nullwerts gelöst werden kann (nicht mit dem Standardparameter in Konflikt stehend) und auch unterstützt wird Rückgabewert vom Typ „void“. 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 ungültig ist, kann im Funktionskörper auf keinen Typ eine Rückgabe folgen oder es wird keine Rückgabeanweisung angezeigt.


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

Nachdem wir den obigen Verlauf überprüft haben, können wir sehen, dass die Funktionstypdeklaration mit PHP 7.1 sehr vollständig war (obwohl sie in der Praxis nicht oft verwendet wird).

Lassen Sie uns über die Fallstricke sprechen, die in der Praxis auftreten. Die verfügbaren Typen für die Parameter- und Rückgabewerttypdeklaration sind:

  1. Class/Interface

  2. self, das nur für seine eigenen Methoden verwendet werden kann

  3. Array

  4. bool

  5. aufrufbar

  6. int

  7. float

  8. string

  9. iterable

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. Aber es funktioniert nicht, wenn es um Typdeklarationen geht. 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.

Verwandte Empfehlungen:

So verwenden Sie Typbeschränkungen, um PHP-Funktionstypen einzuschränken

Einführung in JavaScript-Funktionsfunktionstypen

Perfekte Javascript-Lösung zur Bestimmung des Funktionstyps_Javascript-Kenntnisse

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Funktionstypdeklarationen in verschiedenen PHP-Versionen. 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