Maison  >  Article  >  développement back-end  >  PHP7+ prend également en charge les déclarations de type. Parlons de cette fonctionnalité !

PHP7+ prend également en charge les déclarations de type. Parlons de cette fonctionnalité !

青灯夜游
青灯夜游avant
2022-05-07 21:22:414635parcourir

PHP a également commencé à s'engager dans les déclarations de type. PHP7+ a ajouté la fonctionnalité de déclaration de type. L'article suivant vous fera comprendre les fonctionnalités de la déclaration de type PHP et partagera les pièges de la déclaration de type de retour. tout le monde!

PHP7+ prend également en charge les déclarations de type. Parlons de cette fonctionnalité !

En recherchant récemment les nouvelles fonctionnalités de PHP7, j'ai découvert que PHP a également commencé à utiliser des déclarations de type. Les avantages de cela sont évidents : cela peut améliorer la vitesse d'exécution du programme.

Commençons par l'introduction de cette nouvelle fonctionnalité :

Par défaut, tous les fichiers PHP sont en mode de vérification de type faible.

PHP7+ a ajouté la fonctionnalité de déclaration de type. Il existe deux modes pour la déclaration de type :

  • Mode Force (mode par défaut) Ma compréhension est de forcer la conversion dans le type requis. Il ne fait pas de distinction stricte entre les types mais force. conversion, et les types sont incohérents. Aucune erreur n'est signalée
  • Mode strictType de vérification strict, si le type est incohérent avec la déclaration, une erreur est signalée

Format de syntaxe de déclaration de type scalaire :

declare(strict_types=1);

La valeur de strict_types :

  • 1 représente le mode de vérification de type strict, le rôle Pour les appels de fonction et les instructions de retour ;
  • 0 représente le mode de vérification de type faible

Les paramètres de type qui peuvent être utilisés sont :

  • string
  • int
  • float
  • bool
  • interfaces
  • Array
  • callable

force mode (mode par défaut)

<?php

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

print(sum(1, &#39;2&#39;, 3.1));
?>

La sortie d'exécution du programme ci-dessus est: 6 6

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

严格模式

<?php

declare(strict_types=1);

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

print(sum(1, &#39;2&#39;, 3.1));
?>

以上程序因为采用了严格模式,因为第二个参数不是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;
}

print(returnIntValue(5));
?>

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

返回类型声明错误示例

<?php
declare(strict_types=1);

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

print(returnIntValue(1));
?>

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

void 函数

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

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

实例

<?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);

以上实例输出结果:

null int(2) int(1)

analyse : convertissez le type de chaîne '2' en un type entier 2, convertissez le type float 3.1 en type entier 3 puis additionnez-les pour obtenir le résultat 6.

Mode strict

rrreeeÉtant donné que le programme ci-dessus utilise le mode strict, car le deuxième paramètre n'est pas de type int, le résultat de l'exécution est le suivant :

PHP Fatal error: Uncaught TypeError: Argument 2 passé à sum() doit être du type entier, chaîne donnée, appelée dans...🎜🎜🎜🎜Déclaration du type de retour🎜🎜🎜🎜PHP7+ ajoute la prise en charge de la déclaration du type de retour, qui spécifie le type de valeur de retour de la fonction . 🎜🎜Les types de retour qui peuvent être déclarés sont : 🎜🎜🎜string🎜🎜int🎜🎜float🎜🎜bool🎜🎜interfaces🎜🎜array🎜🎜callable🎜🎜🎜🎜🎜J'ai marché dessus🎜🎜 🎜🎜J'ai en fait été ici avant Pièges, dans la nouvelle version de phpstorm, un code d'invite apparaîtra basé sur le type de valeur de retour, vous guidant pour ajouter une instruction de type de retour, je l'ai donc ajouté. Mais plus tard, en raison de changements commerciaux ou d'optimisation du code, j'ai uniquement modifié la valeur de retour (par exemple, j'ai renvoyé un tableau avant, mais après la modification, j'ai renvoyé un int), mais j'ai oublié de modifier la déclaration du type de retour (après tout, j'ai habitué aux types de langage faibles de PHP depuis tant d'années... ), cela générera une exception et provoquera une erreur. C'est le piège sur lequel j'ai marché, veuillez faire attention lorsque vous l'utilisez. Le langage 🎜🎜🎜🎜Thinking🎜🎜🎜🎜🎜GO n'aura pas le problème que j'ai mentionné ci-dessus, car si le type de valeur de retour et la déclaration du type de retour ne parviennent pas à se compiler, une erreur sera signalée lors de la compilation. 🎜🎜🎜🎜En tant que langage faiblement typé, PHP a fait des optimisations telles que les déclarations de type de retour, mais il ne nous oblige pas à compiler avant que le langage ne soit exécuté. Il peut être directement publié et exécuté, il ne peut donc pas atteindre "l'alarme de compilation". " du langage Go. PHP lèvera une exception directement lors de l'exécution. 🎜🎜rrreee🎜Le résultat de sortie de l'exécution du programme ci-dessus est : 5🎜🎜🎜🎜Exemple d'erreur dans la déclaration du type de retour🎜🎜🎜rrreee🎜En raison du mode strict du programme ci-dessus, la valeur de retour doit être un entier, mais le résultat du calcul est un flottant, provoquant une erreur. Le résultat de l'exécution est : Erreur fatale : Uncaught TypeError : la valeur de retour de returnIntValue() doit être du type entier, float renvoyé. ..🎜🎜🎜🎜void function🎜🎜 🎜🎜🎜Remarque : Une fonction définie avec un type de retour void ne peut pas avoir de valeur de retour, même si elle renvoie null. 🎜🎜🎜Les méthodes dont la valeur de retour est déclarée comme type void doivent soit omettre complètement l'instruction return, soit utiliser une instruction return vide. 🎜🎜🎜Exemple🎜🎜rrreee🎜Le résultat de sortie de l'exemple ci-dessus : 🎜🎜null int(2) int(1)🎜🎜🎜Adresse originale : https://juejin.cn/post/ 7062942459247984648🎜🎜 Auteur : Wang Zhongyang Go🎜🎜🎜Apprentissage recommandé : "🎜Tutoriel vidéo PHP🎜"🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer