2016-11-16 2 views
2

Ich untersuche gerade einige PHP-Codes und versuche, sie auf den neuesten Stand zu bringen. Ich habe eine Funktion gefunden, die ein Dateihandle abruft (über).Typehinting für Dateihandle als Argument in der Funktion

Der Rückkehrtyp ist stream. Ich überprüfte es mit

$handle = fopen("myfile.csv", "r"); 
var_dump(get_resource_type($handle)); 

Wie erwähnt, scheint der Typ stream zu sein.

Wenn ich versuche, dieses Objekt an eine Funktion zu übergeben, kann ich den Typ mit Stream nicht erzwingen.

public function parseHandle(stream $handle){} 

endet mit dieser Fehlermeldung auf:

Argument 1 passed to parseHandle must be an instance of stream, resource given.

Wenn ich versuche, um die Signatur zu function parseHandle(resource $resource) ändern es ergibt sich die folgende Fehlermeldung:

Argument 1 passed to parseHandle must be an instance of resource, resource given

Was die korrekte Datentyp ist und Wie soll ich es in den Argumenten verwenden?

Ich weiß, ich kann is_resource in den ersten Zeilen meiner Funktion verwenden, um es zu überprüfen, aber ich frage mich immer noch.

+1

Eine alternative Lösung könnte den Code in eine Hilfsklasse einbinden. Sie könnten diese Klasse dann als Argument übergeben. – gradosevic

Antwort

4

Leider können Sie den primitiven Typ resource nicht als Typhinweis verwenden. Das neueste Typhinweissystem ändert sich in PHP, scalar type hints, nur hinzugefügt int, float, string und bool.

Der Fehler, den Sie zitiert haben, war zuvor verwirrend, besonders im Kontext der Skalar-Typ-Hinweise. Lassen Sie mich als Templat es für Sie:

Argument [N] passed to [Function] must be an instance of [Class], [Type] given

Die Verwirrung entsteht, weil PHP-Klassen den gleichen Namen wie dokumentiert Primitiven haben können (bool, float, etc.) für alle Primitiven vor PHP 7, und für einige in PHP 7 und später . Wenn Sie also stream $handle sagen, erwartet PHP $handle von der Klasse stream zu sein. In gleicher Weise erwartet resource $handle$handle von Klasse resource zu sein.

Wenn Sie Hinweis Ressourcen eingeben möchten, schlage ich vor, mit einem \SplFileObject:

$handle = new \SplFileObject('myfile.csv', 'r'); 
function parseHandle(\SplFileObject $handle) { ... } 

Dies ist nicht das Beste, was in der Welt, wie \ SplFileObject ein paar Macken, aber am Ende Wenn Sie in PHP einen Tipp geben möchten, müssen Sie entweder ein Array, einen Skalar oder eine Klasse haben.

Verwandte Themen