Je voudrais que mes fonctions attendent des chaînes/entiers ou jettent un ajustement, comme:
warning: preg_match () s'attend à ce que le paramètre 2 soit une chaîne
Cependant pour cette fonction
public function setImage($target, $source_path, integer $width, integer $height){...
Je reçois:
L'argument 4 transmis à My_Helper_Image :: setImage () doit être une instance de nombre entier, nombre entier donné
Mais:
function(array $expectsArray)
fonctionne comme je l’attendais, comment pourrais-je obtenir le même effet que pour les entiers et les chaînes?
Big Update
PHP 7 maintenant prend en charge les astuces de types Scalar
function increment(int $number) {
return $number++;
}
Les types Scalint sont disponibles à partir de PHP 7 :
Les déclarations de type scalaire sont de deux types: coercive (par défaut) et stricte. Les types de paramètres suivants peuvent désormais être appliqués (de manière coercitive ou stricte): chaînes (chaîne), entiers (int), nombres à virgule flottante (float) et booleans (bool). Ils complètent les autres types introduits dans PHP 5: noms de classe, interfaces, tableau et appelable.
Il n'y a pas d'indications de type pour les scalaires avant PHP7. PHP 5.3.99 avait des caractères typographiques scalaires mais il n’a pas été finalisé à ce moment-là s’ils restent et comment ils fonctionneront à ce moment-là.
Néanmoins, il existe des options pour appliquer des arguments scalaires avant PHP7.
Quelques fonctions is_*
vous permettent de le faire, par exemple.
is_int
- Détermine si le type d'une variable est un entieris_string
- Détermine si le type d'une variable est une chaînePour émettre un avertissement, vous utiliseriez
avec un E_USER_WARNING
pour $errorType
.
function setInteger($integer)
{
if (FALSE === is_int($integer)) {
trigger_error('setInteger expected Argument 1 to be Integer', E_USER_WARNING);
}
// do something with $integer
}
Si vous souhaitez utiliser désespérément les astuces sur les types Scalar, consultez
qui montre une technique pour appliquer des typographies scalaires via un gestionnaire d’erreurs personnalisé.
Vous pouvez utiliser "Type Jongler" comme (hauteur) $ hauteur.
Par exemple:
function setImage($target, $source_path, integer $width, $height) {
$height = (int)$height;
...
}
PHP n'implante pas (encore) le typage fort, vous ne pouvez donc pas forcer un paramètre à être un entier. Cela ne s'applique qu'aux classes (l'erreur que vous obtenez implique que $ width devrait être une instance de la classe entière) et aux tableaux.
Les repères de type pour les classes sont disponibles dans PHP 5, les repères de type pour les tableaux commençant par 5.1 et les repères de type apparemment scalaires peuvent (ou peuvent ne pas) être disponibles dans le futur.
Vous pouvez bien sûr, comme d'autres l'ont fait remarquer, vérifier le type dans votre fonction/méthode, mais cela diffère fondamentalement du typage fort. L’effet recherché sera bien entendu présent dans les deux sens.
Si vous n'utilisez pas PHP 7.x ou vous pouvez utiliser args module à partir de PHP bibliothèque non standard (NSPL) . Ce n'est pas aussi sophistiqué et PHP 7.x indice de type mais fait la validation:
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