PHP 没有通用类来处理这个问题,它有一个你可能不习惯使用的数据类型——资源。
资源可用于保存流的文件描述符。它们被用于各种各样的地方,包括文件系统描述符、网络流、维护数据库连接甚至数据库结果集。它们还用于维护上下文信息,这种类型的资源不是流,而是更像数据存储。仅使用 PHP 无法定义您自己的资源类型,它们是底层 C++ 代码的一部分。
在许多方面,资源的行为就像一个对象的实例,最好以这种方式来考虑它们(尽管它们不能像对象一样被序列化或在进程之间传递)。然而,重要的是要注意,PHP不是一种面向对象的语言——它是一种提供许多 OO 特性的脚本语言,忘记这一点后果自负。system.io.stream 提供的方法的功能是在 PHP 中通过接受流资源作为参数的过程函数提供的,而您应该使用哪些函数取决于您使用的流类型。
大多数流资源类型(但不是全部 - 一个值得注意的例外是由套接字扩展创建的那些)可以由 等人读取和fread()
写入fwrite()
。流“扩展”(在所有新的 PHP 安装中默认启用很长时间)试图提供一个通用层来创建、访问和操作各种不同类型的流,但它有其局限性:
- 某些功能不适用于指向标准文件描述符或 Windows 上的外部进程的流(请参阅 参考资料
stream_select()
)
- 虽然流扩展提供了套接字扩展所做的大部分功能,但它并没有提供所有功能(例如多播客户端)
- 由于 PHP 的单线程同步特性,非阻塞多 IO 是一个完整的 PITA 来实现。这不是流的限制,而是 PHP 本身的限制。
- 【其他过去一直困扰着我的局限,暂时想不出来】
如果您想以正确的 OO 方式处理流,则必须编写一个包装过程函数调用的类。