Hier ist mein Code:
function phpwtf(string $s) {
echo "$s\n";
}
phpwtf("Type hinting is da bomb");
Was zu diesem Fehler führt:
Fangender schwerwiegender Fehler: Argument 1, das an phpwtf () übergeben wird, muss eine Instanz von Zeichenfolge sein, Zeichenfolge angegeben
Es ist mehr als ein bisschen Orwellianisch zu sehen, wie PHP den gewünschten Typ in einem Atemzug erkennt und ablehnt. Es gibt fünf Lichter, verdammt.
Was entspricht der Typangabe für Zeichenfolgen in PHP? Bonus Rücksicht auf die Antwort, die genau erklärt, was hier los ist.
php
types
type-hinting
Leepowers
quelle
quelle
Antworten:
Vor PHP 7 können Typhinweise nur verwendet werden, um die Arten von Objekten und Arrays zu erzwingen. Skalartypen sind nicht typisierbar. In diesem Fall wird ein Objekt der Klasse
string
erwartet, aber Sie geben ihm einen (Skalar)string
. Die Fehlermeldung mag lustig sein, sollte aber zunächst nicht funktionieren. Angesichts des dynamischen Typisierungssystems macht dies tatsächlich einen perversen Sinn.Sie können Skalartypen nur manuell "Tipp" eingeben:
quelle
Aus dem PHP-Handbuch :
Also hast du es. Die Fehlermeldung ist nicht wirklich hilfreich, das gebe ich Ihnen aber.
** 2017 bearbeiten **
PHP7 führte weitere Funktionsdatentypdeklarationen ein, und der oben genannte Link wurde zu Funktionsargumenten verschoben : Typdeklarationen . Von dieser Seite:
Die letzte Warnung ist tatsächlich wichtig, um den Fehler "Argument muss vom Typ Zeichenfolge, Zeichenfolge angegeben" zu verstehen. Da meist nur Klassen- / Schnittstellennamen als Argumenttyp zulässig sind, versucht PHP, einen Klassennamen "string" zu finden, kann jedoch keinen finden, da es sich um einen primitiven Typ handelt. Daher schlägt dieser unangenehme Fehler fehl.
quelle
PHP ermöglicht "Hinweise", wo Sie eine Klasse angeben, um ein Objekt anzugeben. Laut PHP-Handbuch können "Typhinweise nur vom Typ Objekt und Array (seit PHP 5.1) sein. Herkömmliche Typhinweise mit int und string werden nicht unterstützt." Der Fehler ist verwirrend, weil Sie "string" gewählt haben - setzen Sie "myClass" an seine Stelle und der Fehler wird anders lauten: "Argument 1, das an phpwtf () übergeben wird, muss eine Instanz von myClass sein, String angegeben"
quelle
Wie andere bereits gesagt haben, funktioniert die Typhinweise derzeit nur für Objekttypen. Ich denke jedoch, dass der von Ihnen ausgelöste Fehler möglicherweise in der Vorbereitung des kommenden Zeichenfolgentyps SplString liegt .
Theoretisch verhält es sich wie eine Zeichenfolge, aber da es sich um ein Objekt handelt, würde es die Objekttypüberprüfung bestehen. Leider ist es noch nicht in PHP 5.3, möglicherweise in 5.4, also habe ich es nicht getestet.
quelle
Ab PHP erlauben 7.0 Typdeklarationen skalare Typen, so sind diese Typen jetzt verfügbar:
self
,array
,callable
,bool
,float
,int
,string
. Die ersten drei waren in PHP 5 verfügbar, aber die letzten vier sind neu in PHP 7. Wenn Sie etwas anderes (z. B.integer
oderboolean
) verwenden, wird dies als Klassenname interpretiert.Weitere Informationen finden Sie im PHP-Handbuch .
quelle
Vielleicht nicht sicher und hübsch, aber wenn Sie müssen:
quelle
new string(array(1,2,3))
Ich habe diesen Fehler beim Aufrufen einer Funktion von einem Laravel Controller in eine PHP-Datei erhalten.
Nach ein paar Stunden fand ich das Problem: Ich habe $ this innerhalb einer statischen Funktion verwendet.
quelle
Using $this when not in object context
ist in der Tat eine kryptische Nachricht.(ursprünglich von Leepowers in seiner Frage gepostet )
Die Fehlermeldung ist aus einem großen Grund verwirrend:
Primitive Typnamen sind in PHP nicht reserviert
Das Folgende sind alle gültigen Klassendeklarationen:
Mein Fehler bestand darin zu denken, dass sich die Fehlermeldung ausschließlich auf den primitiven Typ der Zeichenfolge bezog - das Wort 'Instanz' hätte mir eine Pause geben sollen. Ein Beispiel zur weiteren Veranschaulichung:
Ausgabe:
In PHP ist es möglich
string
, dass a ein ist,string
außer wenn es tatsächlich ein iststring
. Wie bei jeder Sprache, die implizite Typkonvertierung verwendet, ist der Kontext alles.quelle
Ich denke, Typografie auf PHP im inneren Block, String auf PHP ist kein Objekt, wie ich weiß:
quelle
(string) $s
kann einen Fehler auslösen, wenn$s
es sich um ein Objekt handelt, das nicht in einen String umgewandelt werden kann (es ist keine__toString()
Methode implementiert), daher ist es nicht so einfach