228 votes

Vraiment PHP? "L'argument 1 passé à my_function () doit être une instance de string, chaîne donnée"

function phpwtf(string $s) {
    echo "$s\n";
}
phpwtf("Type hinting is da bomb");

Catchable fatal error: Argument 1 passé à phpwtf() doit être une instance de la chaîne, chaîne donnée

C'est plus qu'un peu Orwellien de voir PHP reconnaître et de rejeter le type souhaité dans le même souffle. Il y a cinq lumières, putain.

Quel est l'équivalent de type hinting pour les chaînes de caractères en PHP?

Bonus de l'examen de la réponse qui explique exactement ce qui se passe ici.

Résumé

Le message d'erreur est source de confusion pour une grande raison:

Type primitif noms ne sont pas réservés en PHP

Voici toutes les déclarations de classe:

class string { }
class int { }
class float { }
class double { }

Mon erreur a été de penser que le message d'erreur a été de me référant uniquement à la chaîne de type primitif, le mot "instance" devrait m'ont donné la pause. Un exemple pour illustrer plus loin:

class string { }
$n = 1234;
$s1 = (string)$n;
$s2 = new string();
$a = array('no', 'yes');
printf("\$s1 - primitive string? %s - string instance? %s\n",
        $a[is_string($s1)], $a[is_a($s1, 'string')]);
printf("\$s2 - primitive string? %s - string instance? %s\n",
        $a[is_string($s2)], $a[is_a($s2, 'string')]);

Sortie:

$s1 - primitif de la chaîne? oui - instance de chaîne? pas de

$s2 - primitif de la chaîne? pas de chaîne instance? oui

En PHP il est possible pour un string un string sauf quand c'est en fait un string. Comme avec n'importe quel langage utilise implicite de conversion de type, le contexte est tout.

216voto

deceze Points 200115

Type PHP allusion ne peut être utilisée pour forcer les types d'objets et de tableaux. Types scalaires ne sont pas de type hintable. Dans ce cas, un objet de la classe string est prévu, mais vous êtes en lui donnant un (scalaire) string. Le message d'erreur peut être drôle, mais il n'est pas censé commencer le travail avec. Compte tenu de la dynamique du système de typage, cela fait une sorte de pervers sens.

Vous ne pouvez manuellement "type" des types scalaires:

function foo($string) {
    if (!is_string($string)) {
        trigger_error('No, you fool!');
        return;
    }
    ...
}

29voto

Yanick Rochon Points 18537

Du manuel de PHP :

Type Hints ne peut être que du type objet et tableau (depuis PHP 5.1). Les indicateurs de type traditionnels avec int et string ne sont pas supportés.

Donc vous l'avez. Le message d'erreur n'est pas vraiment utile, je vous le donne cependant.

8voto

Surreal Dreams Points 12016

PHP permet "hinting" où vous fournissez une classe pour spécifier un objet. Selon le manuel de PHP, "Type Hints ne peut être que du type objet et tableau (depuis PHP 5.1). Le type traditionnel indiquant avec int et string n'est pas supporté." L'erreur est confuse à cause de votre choix de "chaîne" - mettre "myClass" à sa place et l'erreur sera lue différemment: "Argument 1 passé à phpwtf () doit être une instance de myClass, chaîne donnée"

3voto

mario Points 76989

Comme d'autres l'ont déjà dit, l'indication de type ne fonctionne actuellement que pour les types d'objet. Mais je pense que l'erreur particulière que vous avez déclenchée pourrait être en préparation du type de chaîne à venir SplString .

En théorie, il se comporte comme une chaîne de caractères, mais comme il s'agit d'un objet, il passe la vérification du type d'objet. Malheureusement, il n'est pas encore en PHP 5.3, pourrait venir en 5.4, donc ne l'ai pas testé.

-1voto

subosito Points 2004

Je pense que typecasting sur php sur un bloc interne, String sur PHP n'est pas un objet comme je le sais:

 <?php
function phpwtf($s) {
    $s = (string) $s;
    echo "$s\n";
}
phpwtf("Type hinting is da bomb");
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X