Heim  >  Artikel  >  Backend-Entwicklung  >  PHP7+ unterstützt auch Typdeklarationen. Sprechen wir über diese Funktion!

PHP7+ unterstützt auch Typdeklarationen. Sprechen wir über diese Funktion!

青灯夜游
青灯夜游nach vorne
2022-05-07 21:22:414643Durchsuche

PHP hat auch damit begonnen, sich mit der Typdeklaration zu befassen. Der folgende Artikel wird Ihnen helfen, die Funktionen der PHP-Typdeklaration zu verstehen und die Fallstricke bei der Rückgabetypdeklaration zu erläutern alle!

PHP7+ unterstützt auch Typdeklarationen. Sprechen wir über diese Funktion!

Kürzlich habe ich die neuen Funktionen von PHP7 studiert und festgestellt, dass PHP auch damit begonnen hat, Typdeklarationen zu verwenden. Die Vorteile liegen auf der Hand: Es kann die Ausführungsgeschwindigkeit des Programms verbessern.

Beginnen wir mit der Einführung dieser neuen Funktion:

Standardmäßig befinden sich alle PHP-Dateien im schwachen Typprüfungsmodus.

PHP7+ hat die Funktion der Typdeklaration hinzugefügt. Es gibt zwei Modi für die Typdeklaration:

  • Erzwungener Modus (Standardmodus) Mein Verständnis ist, dass es nicht strikt zwischen Typen unterscheidet Konvertierung erzwingen, und die Typen sind inkonsistent.
  • Strenger ModusÜberprüfen Sie den Typ genau. Wenn der Typ nicht mit der Deklaration übereinstimmt, wird ein Fehler gemeldet

Syntaxformat für die Skalartypdeklaration:

declare(strict_types=1);

Der Wert von strict_types:

  • 1 stellt den strengen Typüberprüfungsmodus dar, die Rolle für Funktionsaufrufe und Rückgabeanweisungen; int
  • bool
interfaces

array
  • callable
  • Force-Modus (Standardmodus)
  • <?php
    
    function sum(int ...$ints)
    {
       return array_sum($ints);
    }
    
    print(sum(1, &#39;2&#39;, 3.1));
    ?>
  • Die Ausführungsausgabe des obigen Programms ist: 6
  • Analyse: Konvertieren Sie den String-Typ „2“ in einen Integer-Typ 2, konvertieren Sie den Float-Typ 3.1 in den Integer-Typ 3 und addieren Sie sie dann, um das Ergebnis 6 zu erhalten.

Strenger Modus

<?php

declare(strict_types=1);

function sum(int ...$ints)
{
   return array_sum($ints);
}

print(sum(1, &#39;2&#39;, 3.1));
?>
Da das obige Programm den strikten Modus verwendet und der zweite Parameter nicht vom Typ int ist, lautet das Ausführungsergebnis wie folgt:

PHP Fatal error: Uncaught TypeError: Argument 2 übergeben an sum() muss vom Typ Ganzzahl, angegebener String, aufgerufen in... sein.6

分析一下即:将字符串类型的'2'转换成整型的2,将float类型的3.1转换为整型的3后再相加,得出结果6。

严格模式

<?php
declare(strict_types=1);

function returnIntValue(int $value): int
{
   return $value;
}

print(returnIntValue(5));
?>

以上程序因为采用了严格模式,因为第二个参数不是int类型,执行结果报错如下:

PHP Fatal error:  Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, called in……

返回类型声明

PHP7+ 增加了对返回类型声明的支持,返回类型声明指明了函数返回值的类型。

可以声明的返回类型有:

  • string
  • int
  • float
  • bool
  • interfaces
  • array
  • callable

我踩的坑

这里我还真趟过坑,在新版本的phpstorm中会根据返回值类型出现提示代码,引导添加返回类型声明,我就加上了。但是后面因为业务的变化或者代码优化只修改了返回值(比如之前返回的是array,修改后返回了int),却忘记了修改返回类型声明(毕竟习惯了PHP弱语言类型这么多年了...),这样是会抛出异常导致报错的,这就是我踩到的坑,小伙们们在使用过程中要注意。

思考

GO语言是不会出现我上面说的问题的, 因为如果返回值类型和返回类型声明是编译不通过的,编译的时候就会报错。

而PHP作为弱类型语言,虽然做了返回类型声明这种优化,但是语言执行前不需要我们编译,直接发布运行,也就不能做到go语言的“编译报警”了,PHP会在执行的时候直接抛出异常。

<?php
declare(strict_types=1);

function returnIntValue(int $value): int
{
   return $value + 3.0;
}

print(returnIntValue(1));
?>

以上程序执行输出结果为:5

返回类型声明错误示例

<?php
function exchange(&$left, &$right) : void
{
    if ($left === $right) {
        return;
    }

    $tmp = $left;
    $left = $right;
    $right = $tmp;
}

$a = 1;
$b = 2;
var_dump(exchange($a, $b), $a, $b);

以上程序由于采用了严格模式,返回值必须是 int,但是计算结果是float,导致报错,执行输出结果为:Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...

void 函数

注意:定义返回类型为 void 的函数不能有返回值,即使返回 null 也不行。

返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。

实例

rrreee

以上实例输出结果:

null int(2) int(1)

Deklaration des Rückgabetyps

PHP7+ fügt Unterstützung für die Deklaration des Rückgabetyps hinzu, die den Typ des Rückgabewerts der Funktion angibt .

Die Rückgabetypen, die deklariert werden können, sind:

🎜string🎜🎜int🎜🎜float🎜🎜bool🎜🎜interfaces🎜🎜array🎜🎜callable🎜🎜🎜🎜🎜Ich bin darauf getreten🎜 🎜 🎜🎜Das war ich tatsächlich Hier vor Pitfalls wird in der neuen Version von phpstorm ein Eingabeaufforderungscode basierend auf dem Rückgabewerttyp angezeigt, der Sie zum Hinzufügen einer Rückgabetypanweisung führt, also habe ich ihn hinzugefügt. Aber später habe ich aufgrund von Geschäftsänderungen oder Codeoptimierungen nur den Rückgabewert geändert (z. B. habe ich vorher ein Array zurückgegeben, aber nach der Änderung habe ich int zurückgegeben), aber ich habe vergessen, die Rückgabetypdeklaration zu ändern (schließlich habe ich das getan). Ich bin seit so vielen Jahren an die schwachen Sprachtypen von PHP gewöhnt...), wird dies eine Ausnahme auslösen und einen Fehler verursachen. Das ist die Falle, auf die ich getreten bin. 🎜🎜🎜🎜Thinking🎜🎜🎜🎜🎜GO-Sprache wird das oben erwähnte Problem nicht haben, denn wenn der Rückgabewerttyp und die Rückgabetypdeklaration nicht kompiliert werden können, wird während der Kompilierung ein Fehler gemeldet. 🎜🎜🎜🎜Als schwach typisierte Sprache hat PHP Optimierungen wie Rückgabetypdeklarationen vorgenommen, erfordert jedoch keine Kompilierung vor der Ausführung der Sprache. Es kann direkt freigegeben und ausgeführt werden, sodass der „Kompilierungsalarm“ nicht erreicht werden kann " der Go-Sprache. PHP löst direkt während der Ausführung eine Ausnahme aus. 🎜🎜rrreee🎜Das Ausgabeergebnis der Ausführung des obigen Programms ist: 5🎜🎜🎜🎜Beispiel für einen Rückgabetyp-Deklarationsfehler🎜🎜🎜rrreee🎜Aufgrund des strikten Modus des obigen Programms ist das Der Rückgabewert muss int sein, aber das Berechnungsergebnis ist ein Float, was zu einem Fehler führt. Die Ausführungsausgabe lautet: Schwerwiegender Fehler: Nicht erfasster TypeError: Der Rückgabewert von returnIntValue() muss vom Typ Integer sein, zurückgegebener Float. .🎜🎜🎜🎜void-Funktion🎜🎜 🎜🎜🎜Hinweis: Eine mit dem Rückgabetyp void definierte Funktion kann keinen Rückgabewert haben, selbst wenn sie null zurückgibt. 🎜🎜🎜Methoden, deren Rückgabewert als void-Typ deklariert ist, müssen entweder die Return-Anweisung ganz weglassen oder eine leere Return-Anweisung verwenden. 🎜🎜🎜Beispiel🎜🎜rrreee🎜Das Ausgabeergebnis des obigen Beispiels: 🎜🎜null int(2) int(1)🎜🎜🎜Originaladresse: https://juejin.cn/post/ 7062942459247984648🎜🎜 Autor: Wang Zhongyang Go🎜🎜🎜Empfohlenes Lernen: „🎜PHP-Video-Tutorial🎜“🎜

Das obige ist der detaillierte Inhalt vonPHP7+ unterstützt auch Typdeklarationen. Sprechen wir über diese Funktion!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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