web-dev-qa-db-fra.com

PHP 7: Comment utiliser un type de paramètre mixte dans mes propres fonctions?

Je veux définir une fonction PHP 7 qui prend un paramètre de type mixte. (Ce que je veux, c'est l'équivalent d'un paramètre de type générique en C #; s'il existe un meilleur moyen de l'émuler dans PHP 7, merci de me le faire savoir.)

Mon code est comme suit.

<?php
declare (strict_types = 1);    

function test (mixed $s) : mixed {
    return $s;
}

// Works
echo gettype ('hello');
// Does not work
echo test ('hello');
?>

Lorsque je lance ce code, j'obtiens ce qui suit.

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of mixed, string given, called in mixed.php on line 11 and defined in mixed.php:4
Stack trace:
#0 mixed.php(11): test('hello')
#1 {main}
thrown in mixed.php on line 4

Si je commente l'appel à test (), le code fonctionne correctement, donc apparemment, je peux au moins utiliser le type de paramètre mélangé dans la déclaration de fonction.

Je sais que les fonctions intégrées PHP telles que gettype () peuvent prendre des paramètres mixtes, bien que je ne sache pas si elles utilisent un typage strict en interne.

Je vois que "mixed" est également utilisé comme pseudo-type dans PHP documentation , je risque donc de mal comprendre le but de "mixed" en tant que mot clé PHP, mais ce que je vois ici au moins m'implique que c'est un mot clé légitime. Est-ce que je l'utilise simplement d'une manière qui n'y est pas destinée?

Enfin, je me rends compte que je pourrais contourner tout cela en ne spécifiant tout simplement pas le type de paramètre, mais j'aimerais être cohérent en spécifiant tous mes types de paramètres et de retours.

Merci et s'il vous plaît laissez-moi savoir si je peux fournir des informations supplémentaires.

9
FSharpN00b

FYImixten'est pas un type. ( Reportez-vous à la documentation ). C'est seulement un pseudo type : un indice qu'un type quelconque peut être passé ou renvoyé par une méthode ... ou peut-être pour une variable qui a été typée de manière lâche comme mélangée pour une raison quelconque ... 

Contrairement à C #, ce que vous essayez d’obtenir risque d’être délicat en PHP, en particulieravec strict_types défini sur true

Cependant, vous pouvez obtenir un effet presque similaire sans dactylographie stricte - auquel cas vos méthodes peuvent accepter n'importe quel type tant que vous ne fournissez pas d'indications de type. Bien que pour les programmeurs C #, c’est mauvais - et pourtant, c’est le jus de PHP .

11
Poiz

Peut-être que l'opérateur? Travaille pour cela également comme indiqué sur http://php.net/manual/de/functions.returning-values.php#functions.returning-values.type-declaration

0
Alexander Behling