web-dev-qa-db-fra.com

php: Déclare le type d'arguments d'une fonction

J'essaie de créer une fonction avec des types d'argument déclarés, pour vérifier rapidement s'ils sont dans le bon format, mais quand il retourne une chaîne, cette erreur:

Catchable fatal error: Argument 2 passed to myfunction() must be an instance of string, string given, called in path_to_file on line 69 and defined in path_to_file on line 49

Exemple

function myfunction( array $ARRAY, string $STRING, int $INTEGER ) { 
    return "Args format correct"; 
}
myfunction(array("1",'2','3','4'), "test" , 1234);

Où est l'erreur?

19
oscurodrago

Selon la documentation PHP5 :

Les astuces de type ne peuvent être que de type objet et tableau (depuis PHP 5.1). Les conseils de type traditionnels avec int et string ne sont pas pris en charge.

Puisque string et int ne sont pas des classes, vous ne pouvez pas les "attribuer à un type" dans votre fonction.

A partir de PHP 7.0, le type d'argument déclaré est string, int, float, bool. 

38
Loïs Di Qual

Cela peut être utile pour tous ceux qui voient ce post depuis la disponibilité de PHP 7

Avec PHP 7, il est maintenant possible de déclarer des types. Vous pouvez vous référer au lien suivant pour plus d'informations.

http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration

function(string $name, boolean $is_admin) {
    //do something
}
10
Amal Ajith

Vous pouvez faire quelque chose comme ça qui a toujours fonctionné pour moi

pour ficelle 

function setData($Name=""){ }

cela force le nom à être une chaîne, il ne vérifie pas si c'est une chaîne

pour les valeurs numériques 

function setData($age=0){ }

cela force l'âge à être un nombre, si une chaîne est passée, la valeur sera 0

pour les valeurs de tableau, il y a deux variations

function setData(array $data){ } 

si un tableau n'est pas passé, une erreur serait générée

function setData($data=array()){ } 

Cela passerait un tableau vide sans valeur est donné pour $data

7
Smith

Selon PHP Manuel , vous pouvez le faire pour array sur PHP 5.1 et au-delà et pour string et int types sur PHP 7 et au-delà. Regarde:

  • Class/interface name Le paramètre doit être une instance du nom de classe ou d'interface donné. PHP 5.0.0
  • self Le paramètre doit être une instance de la même classe que celle sur laquelle la méthode est définie. Ceci ne peut être utilisé que sur des méthodes de classe et d'instance. PHP 5.0.0
  • array Le paramètre doit être un tableau. PHP 5.1.0

  • callable Le paramètre doit être un appelable valide. PHP 5.4.0
  • bool Le paramètre doit être une valeur booléenne. PHP 7.0.0
  • float Le paramètre doit être un nombre à virgule flottante. PHP 7.0.0
  • int Le paramètre doit être un entier. PHP 7.0.0

  • string Le paramètre doit être une chaîne. PHP 7.0.0

  • iterable Le paramètre doit être un tableau ou une instance de Traversable. PHP 7.1.0
3
Machado

string, int et les autres types intégrés ne sont pas classes , en argument vous spécifiez classe , de l'argument. Le seul type intégré pris en charge à y être placé est array.

1
devdRew

Vous ne pouvez pas définir le type comme string et int. PHP "ne sait pas" ce qu'ils sont.

0
Aurelio De Rosa

Si vous n'utilisez pas PHP 7.x ou si vous avez besoin de quelques validations d'arguments complexes (comme "un tableau ou\Traversable" car vous pouvez parcourir des tableaux, mais ce sont des types primitifs et vous n'implémentez pas l'interface\Traversable), vous pouvez utilisez args module à partir de Bibliothèque PHP non standard (NSPL) .

use const \nspl\args\numeric;
use function \nspl\args\expects;

function sqr($x)
{
    expects(numeric, $x);
    return $x * $x;
}

sqr('hello world');

Les sorties:

InvalidArgumentException: Argument 1 passed to sqr() must be numeric, string given in /path/to/example.php on line 17

Call Stack:
    0.0002     230304   1. {main}() /path/to/example.php:0
    0.0023     556800   2. sqr() /path/to/example.php:17
0
Ihor Burlachenko

quand j'ai besoin d'utiliser des astuces de types, je fais ceci:

<?php 
declare(strict_types=1);
0
fdiaz7