web-dev-qa-db-fra.com

Comment forcer les arguments à être un entier/une chaîne

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++;
}
21
Moak

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.

Pour émettre un avertissement, vous utiliseriez

avec un E_USER_WARNING pour $errorType.

Exemple

function setInteger($integer)
{
    if (FALSE === is_int($integer)) {
        trigger_error('setInteger expected Argument 1 to be Integer', E_USER_WARNING);
    }
    // do something with $integer
}

Alternative

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é.

25
Gordon

Vous pouvez utiliser "Type Jongler" comme (hauteur) $ hauteur.

Par exemple:

function setImage($target, $source_path, integer $width, $height) {
    $height = (int)$height;
    ...
}
5
Frank

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.

2
Peter Lindqvist

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
0
Ihor Burlachenko