2016-11-16 5 views
2

現在、私はいくつかのPHPコードを調査しており、最新のものにしようとしています。ファイルハンドルを取得する関数が見つかりました(fopen経由)。関数の引数としてfilehandleの型をヒンティングする

returntypeはstreamです。私はそれをチェックしました

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

前述のように、タイプはstreamと思われます。

このオブジェクトを関数に渡そうとすると、ストリームで強制的にその型を強制することはできません。

public function parseHandle(stream $handle){} 

は、このエラーメッセージで終了:私はfunction parseHandle(resource $resource)に署名を変更しようとすると

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

それは次のようなエラーが得られます。

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

正しいデータ型は何とどのように私は議論でそれを使用する必要がありますか?

私はis_resourceを私の関数の最初の行に使用することができますが、私はまだ疑問に思っています。

+1

代替ソリューションは、ヘルパークラスにコードをラップすることができます。そのクラスを引数として渡すことができます。 – gradosevic

答えて

4

残念ながら、タイプヒントとしてプリミティブタイプresourceを使用することはできません。最新のタイプヒントシステムは、scalar type hintsに変更され、int,float,stringおよびboolが追加されました。

あなたが引用しているエラーは、特にスカラー型のヒントの文脈で混乱していると思います。私はあなたのためにそれをテンプレートしてみましょう:

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

混乱がPHPはクラスはPHP 7の前に、すべてのプリミティブの文書プリミティブ(boolfloat、など)と同じ名前を持つことができますので、発生し、中にいくつかのためにPHP 7以降 。したがって、あなたがstream $handleと言うとき、PHPは$handleがクラスstreamであると予想しています。同様にresource $handleは、$handleがクラスresourceであると予測します。

あなたはヒントリソースを入力したい場合、私は\SplFileObjectを使用することをお勧め:

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

これは\ SplFileObjectはいくつかの癖を持っているとして、世界でも最高のものではなく、の終わりにあなたがPHPでヒントをタイプしたいならば、配列、スカラー、またはクラスを持たなければなりません。

関連する問題