PHP Tapez les types scalaires, les tableaux et les callables


Exemple

La prise en charge des paramètres de tableau de type indice (et le retour des valeurs après PHP 7.1) a été ajoutée à PHP 5.1 avec le array mots-clés. Les tableaux de toutes dimensions et de tous types, ainsi que les tableaux vides, sont des valeurs valides.

Le support des callables de type hinting a été ajouté dans PHP 5.4. Toute valeur is_callable() est valide pour les paramètres et les valeurs de retour appelées callable , à savoir les objets de Closure , les chaînes de noms de fonctions et les array(class_name|object, method_name) .

Si une faute de frappe se produit dans le nom de la fonction de telle sorte qu'elle ne soit pas is_callable() , un message d'erreur moins évident serait affiché:

Erreur irrécupérable: TypeError Uncaught: l'argument 1 transmis à foo () doit être du type callable, string / array donné

function foo(callable $c) {}
foo("count"); // valid
foo("Phar::running"); // valid
foo(["Phar", "running"); // valid
foo([new ReflectionClass("stdClass"), "getName"]); // valid
foo(function() {}); // valid

foo("no_such_function"); // callable expected, string given

Les méthodes non statiques peuvent également être transmises en tant qu'appelants au format statique, ce qui entraîne un avertissement de dépréciation et une erreur de niveau E_STRICT dans PHP 7 et 5 respectivement.

La visibilité de la méthode est prise en compte. Si le contexte de la méthode avec le paramètre callable n'a pas accès à l'appelable fourni, il se retrouvera comme si la méthode n'existait pas.

class Foo{
  private static function f(){
    echo "Good" . PHP_EOL;
  }

  public static function r(callable $c){
    $c();
  }
}

function r(callable $c){}

Foo::r(["Foo", "f"]);
r(["Foo", "f"]);

Sortie:

Erreur irrécupérable: UnError TypeError: L'argument 1 transmis à r () doit pouvoir être appelé, tableau donné

La prise en charge des types scalaires de type hinting a été ajoutée en PHP 7. Cela signifie que nous prenons en charge les indications de type pour les integer boolean , les integer , les integer float et les string .

<?php

function add(int $a, int $b) {
    return $a + $b;
}

var_dump(add(1, 2)); // Outputs "int(3)"

Par défaut, PHP tentera de convertir tout argument fourni pour correspondre à son indice de type. Changer l'appel à add(1.5, 2) donne exactement le même résultat, puisque le float 1.5 été converti en int par PHP.

Pour arrêter ce comportement, il faut ajouter declare(strict_types=1); en haut de chaque fichier source PHP qui le nécessite.

<?php

declare(strict_types=1);

function add(int $a, int $b) {
    return $a + $b;
}

var_dump(add(1.5, 2));

Le script ci-dessus génère désormais une erreur fatale:

Erreur fatale: UnCaught TypeError: l'argument 1 transmis à add () doit être du type entier, float donné

Une exception: types spéciaux

Certaines fonctions PHP peuvent renvoyer une valeur de type resource . Comme il ne s'agit pas d'un type scalaire, mais d'un type spécial, il n'est pas possible de le saisir.

Par exemple, curl_init() renverra une resource , ainsi que fopen() . Bien sûr, ces deux ressources ne sont pas compatibles entre elles. À cause de cela, PHP 7 lancera toujours le TypeError suivant lorsque vous tapez explicitement une resource conseil:

TypeError: l'argument 1 transmis à sample () doit être une instance de ressource, ressource donnée