Maison  >  Article  >  développement back-end  >  Résumé de la déclaration du type de fonction PHP

Résumé de la déclaration du type de fonction PHP

藏色散人
藏色散人avant
2019-11-11 13:47:383312parcourir

PHP7 commence à prendre en charge la déclaration de type scalaire, et la saveur du langage fortement typé est relativement forte. En utilisant cette fonctionnalité, j'ai rencontré deux pièges : une fois lors de la déclaration de paramètres de type booléen, et plus récemment lors de la déclaration de paramètres de type double, qui ont tous deux entraîné des erreurs d'exécution. Afin d'éviter de commettre des erreurs similaires à l'avenir, j'ai lu les documents officiels ces derniers jours. Cet article est un résumé de l'utilisation des déclarations de type dans les fonctions PHP après l'avoir lu.

Syntaxiquement, la définition des fonctions PHP a traversé plusieurs périodes :

Antiquité (PHP 4)

Il est très simple de définir une fonction, utilisez la déclaration syntaxique de function name(args) {body}. Les types de paramètres et de valeurs de retour ne peuvent pas être spécifiés, et il existe un nombre illimité de types de paramètres et de valeurs de retour possibles. C’est de loin la manière la plus courante de déclarer une fonction.

Déclaration de la valeur des paramètres de type tableau et référence (PHP 5)

Le tableau, la classe, l'interface et l'appelable peuvent être utilisés dans la déclaration de fonction. À partir de la version 5.6, les constantes (y compris les constantes de classe) sont prises en charge comme paramètres par défaut, ainsi que les tableaux de paramètres (préfixés par des points de suspension...). Par exemple :

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

Remarque : Si la valeur du paramètre peut être nulle, null doit être la valeur par défaut du paramètre, sinon une erreur se produira lors de l'appel. Par exemple :

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

Type scalaire et déclaration de valeur de retour (PHP 7)

Les fonctions prennent officiellement en charge les types scalaires (int, bool, float, string) et les types de valeur de retour (Le type déclarable est le même que le paramètre) déclaration. A partir de cette version, à l'exception des différences de syntaxe, les déclarations de fonctions peuvent être formellement faites comme des langages fortement typés.

Malheureusement, si la valeur de retour de la fonction peut être nulle, le type de valeur de retour ne peut pas être spécifié. Par exemple :

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

Les paramètres et les valeurs de retour peuvent être nuls et nuls, déclaration de type de retour (PHP 7.1)

Lorsque les types de paramètres et de valeurs de retour peuvent être nuls, le type est précédé de un point d'interrogation (?) La modification peut résoudre le problème des valeurs nulles (n'entre pas en conflit avec les paramètres par défaut) ; la déclaration de type ajoute un itérable et prend également en charge les valeurs de retour de type void. Par exemple :

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

Lorsque la valeur de retour de la fonction est void, le corps de la fonction ne peut rien renvoyer (l'écriture de return void ; est également fausse !), ou l'instruction return peut être omise.

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

En regardant les changements historiques ci-dessus, nous pouvons voir que la déclaration des types de fonctions a été très complète dans PHP 7.1 (même si elle n'est pas beaucoup utilisée dans la pratique). Notez que l'article parle des déclarations de types de paramètres et de valeurs de retour. PHP ne garantit pas que les types de paramètres restent inchangés pendant le fonctionnement, c'est-à-dire que le code suivant est légal :

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

De ce point de vue, PHP est encore un langage faiblement typé, la compilation statique ne peut pas être effectuée.

Parlons des pièges rencontrés dans la pratique. Selon la documentation officielle, les types disponibles pour les déclarations de paramètres de fonction et de types de valeurs de retour sont :

● class/interface

● self, qui ne peut être utilisé que sur ses propres méthodes

Quantity array

Quantity bool

Quantity callable

Quantity int

Quantity float

Quantity string

● itérable

● void (utilisé uniquement pour la valeur de retour)

Notez qu'il n'y a pas de types booléens et doubles dans la liste ! À moins que vous ne définissiez ces deux types, il est erroné de les utiliser dans les paramètres et les valeurs de retour !

C'est aussi là que PHP est un peu pénible. Les deux mots-clés double et float en utilisation normale sont presque les mêmes. Par exemple, doubleval est un alias de floatval, is_double est un alias de is_float et (double) et (float) ont le même effet lors de la conversion. Mais c'est différent lorsqu'il est utilisé dans des déclarations de type. La même situation se produit avec bool et boolean.

Résumé

À l'heure actuelle, la version stable de PHP 7.2 a été publiée. Il est recommandé d'utiliser autant que possible PHP 7.1 et les versions ultérieures dans les nouveaux projets. Afin d'écrire du code clair et maintenable, les types déclaratifs sont recommandés. Il est recommandé d'utiliser des valeurs nulles uniquement pour les types de référence ou les chaînes, et d'essayer de ne pas utiliser null pour les paramètres de type scalaire tels que int/float. Essayez de ne pas utiliser func_get_argc et d'autres fonctions sauf si nécessaire.

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