PHP には、これに対処するためのジェネリック クラスがありません。これには、作業に慣れていないかもしれないデータ型 ( Resource ) があります。
リソースは、ストリームのファイル記述子を保持するために使用できます。これらは、ファイル システム記述子、ネットワーク ストリーム、データベース接続の維持、さらにはデータベースの結果セットなど、さまざまな場所で使用されます。また、コンテキスト情報を維持するためにも使用されます。このタイプのリソースはストリームではなく、データ ストアのように動作します。PHP だけで独自のリソース タイプを定義することはできません。それらは基礎となる C++ コードの一部です。
多くの点で、リソースはオブジェクトのインスタンスのように動作し、おそらくこのように考えるのが最善です (ただし、オブジェクトのようにシリアル化したり、プロセス間で渡したりすることはできません)。ただし、PHP はオブジェクト指向言語ではないことに注意してください。これは、多くの OO 機能を提供するスクリプト言語であり、危険を冒して忘れてください。system.io.stream によって提供されるメソッドの機能は、ストリーム リソースを引数として受け入れる手続き型関数を介して PHP で提供されます。どの関数を使用する必要があるかは、使用しているストリームの種類によって異なります。
ほとんどのストリーム リソース タイプ (ただし、すべてではない - 重要な例外は、socketsfread()
拡張機能によって作成されたものです) は、fwrite()
他によって読み書きできます。ストリームの「拡張機能」 (非常に長い間、すべての新しい PHP インストールでデフォルトで有効になっています) は、さまざまな種類のストリームを作成、アクセス、および操作するための汎用レイヤーを提供しようとしますが、制限があります。
- 一部の機能は、Windows の標準ファイル記述子または外部プロセスを指すストリームでは機能しません (「 」を参照
stream_select()
) 。
- ストリーム拡張機能は、ソケット拡張機能が提供する機能の多くを提供しますが、すべてを提供するわけではありません (マルチキャスト クライアントなど)。
- PHP のシングル スレッド同期の性質により、ノンブロッキング マルチ IO は完全な PITA として実装されます。これはストリームの制限ではなく、PHP 自体の制限です。
- [過去に私を悩ませたその他の制限、現時点では思い浮かびません]
オブジェクト指向の適切な方法でストリームを処理したい場合は、手続き型関数呼び出しをラップするクラスを作成する必要があります。