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?
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.
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
}
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
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.0self
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.0bool
Le paramètre doit être une valeur booléenne. PHP 7.0.0float
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.0string
, 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
.
Vous ne pouvez pas définir le type comme string
et int
. PHP "ne sait pas" ce qu'ils sont.
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
quand j'ai besoin d'utiliser des astuces de types, je fais ceci:
<?php
declare(strict_types=1);