Voici mon code:
function phpwtf(string $s) {
echo "$s\n";
}
phpwtf("Type hinting is da bomb");
Ce qui entraîne cette erreur:
Erreur fatale capturable: l'argument 1 passé à phpwtf () doit être une instance de chaîne, chaîne donnée
C'est plus qu'un peu orwellien de voir PHP reconnaître et rejeter le type souhaité dans le même souffle. Il y a cinq lumières, bon sang.
Quel est l'équivalent de l'indication de type pour les chaînes en PHP? Bonus à la réponse qui explique exactement ce qui se passe ici.
php
types
type-hinting
leepowers
la source
la source
Réponses:
Avant PHP 7, l' indication de type ne peut être utilisée que pour forcer les types d'objets et de tableaux. Les types scalaires ne sont pas indexables. Dans ce cas, un objet de la classe
string
est attendu, mais vous lui donnez un (scalaire)string
. Le message d'erreur peut être drôle, mais il n'est pas censé fonctionner pour commencer. Étant donné le système de typage dynamique, cela a en fait une sorte de sens perverti.Vous ne pouvez manuellement "taper l'indice" que les types scalaires:
la source
Depuis le manuel de PHP :
Vous l'avez donc. Le message d'erreur n'est pas vraiment utile, je vous le donne quand même.
** 2017 Modifier **
PHP7 a introduit plus de déclarations de type de données de fonction, et le lien susmentionné a été déplacé vers les arguments de fonction: déclarations de type . De cette page:
Le dernier avertissement est en fait significatif pour comprendre l'erreur "L'argument doit être de type chaîne, chaîne donnée"; puisque la plupart du temps, seuls les noms de classe / interface sont autorisés comme type d'argument, PHP essaie de localiser un nom de classe "chaîne", mais ne peut en trouver car il s'agit d'un type primitif, échouez donc avec cette erreur gênante.
la source
PHP permet "d'indiquer" où vous fournissez une classe pour spécifier un objet. Selon le manuel PHP, "Les conseils de type ne peuvent être que du type objet et tableau (depuis PHP 5.1). Les conseils de type traditionnel avec int et chaîne ne sont pas pris en charge." L'erreur est déroutante en raison de votre choix de "chaîne" - mettez "maClasse" à sa place et l'erreur se lira différemment: "L'argument 1 passé à phpwtf () doit être une instance de maClasse, chaîne donnée"
la source
Comme d'autres l'ont déjà dit, les indications de type ne fonctionnent 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 prochain type de chaîne SplString .
En théorie, il se comporte comme une chaîne, mais puisqu'il s'agit d'un objet, il passerait la vérification du type d'objet. Malheureusement, il n'est pas encore en PHP 5.3, pourrait arriver en 5.4, alors ne l'avez pas testé.
la source
Comme des déclarations de type PHP 7.0 permettent les types scalaires, de sorte que ces types sont disponibles:
self
,array
,callable
,bool
,float
,int
,string
. Les trois premiers étaient disponibles en PHP 5, mais les quatre derniers sont nouveaux en PHP 7. Si vous utilisez autre chose (par exempleinteger
ouboolean
) qui sera interprété comme un nom de classe.Voir le manuel PHP pour plus d'informations .
la source
Peut-être pas sûr et joli mais si vous devez:
la source
new string(array(1,2,3))
J'ai eu cette erreur lors de l'appel d'une fonction d'un contrôleur Laravel à un fichier PHP.
Après quelques heures, j'ai trouvé le problème: j'utilisais $ this depuis une fonction statique.
la source
Using $this when not in object context
est en effet un message cryptique.(initialement publié par leepowers dans sa question)
Le message d'erreur prête à confusion pour une grande raison:
Les noms de types primitifs ne sont pas réservés en PHP
Voici toutes les déclarations de classe valides:
Mon erreur était de penser que le message d'erreur faisait uniquement référence au type de chaîne primitive - le mot «instance» aurait dû me donner une pause. Un exemple pour illustrer davantage:
Production:
En PHP, il est possible que a
string
soit unstring
sauf quand c'est réellement unstring
. Comme pour tout langage qui utilise une conversion de type implicite, le contexte est tout.la source
Je pense que le transtypage sur php sur le bloc intérieur, String sur PHP n'est pas un objet comme je le sais:
la source
(string) $s
peut lancer une erreur s'il$s
s'agit d'un objet qui ne peut pas être converti en chaîne (aucune__toString()
méthode n'est implémentée), donc ce n'est pas aussi simple que cela