面向对象的I/O设施
Requires
- php: >=5.5
Requires (Dev)
- phpunit/phpunit: ~4.8
This package is auto-updated.
Last update: 2020-02-09 03:41:22 UTC
README
EXSyst I/O组件
面向对象的I/O设施
源
源对象(实现SourceInterface的对象)可以用来从多个来源读取原始数据块
StringSource可用于从字符串读取数据;StreamSource可用于从PHP流资源读取数据,**但不提供对封装PHP流实现中大多数缺陷的保护**;如果流是可写的或双向的,它们也可以用作Sink(下一节将详细介绍);BufferedSource可用于包装其他源,以修复它们实现中可能存在的缺陷,并添加缺失的功能(例如,你是否已经需要过,哪怕只是一次,在套接字上向后搜索?);OuterSource是抽象的:您可以扩展它们以在现有Source上提供附加服务(例如,BufferedSource和Reader是OuterSource)。
您可以直接从类的构造函数创建Source,或使用Source类的静态方法,这些方法可能提供附加服务(例如,fromStream和fromFile默认将StreamSource包装在BufferedSource中)。
Source类还提供了静态实用方法。
汇
汇对象(实现SinkInterface的对象)可以用来将原始数据块写入多个汇
StringSink可用于构建字符串(但可能比普通连接更快:注意调用开销!);SystemSink是echo的一个简单包装器;它是一个单例;RecordFunctionSink可用于将数据聚合到记录中(固定大小,或由分隔符限定,可选大小限制),并将它们传递给自定义函数;- (请参阅上一节)封装可写或双向流的
StreamSource可用于将数据写入PHP流资源; TeeSink可用于将数据复制到多个Sink。
与Source类一样,Sink类也提供了静态方法,可以用来轻松创建Sink,以及静态实用方法。
状态
状态对象(实现StateInterface的对象)可以通过调用支持它的Source上的captureState方法来获取。它们可以用来使用restore方法将Source回滚到先前的位置。
如果需要回滚Source并且它不支持该功能,您可以将Source包装在BufferedSource中。
读取器
读取器对象(不实现任何特定接口,因为它们提供许多不同的服务)可以用来从Source读取结构化数据
CDataReader可以用于简化编写词法分析器:它们支持eat固定字符串、包含或排除特定字符类的字符串以及空白符;StringCDataReader是针对StringSource优化的CDataReader,它还支持使用preg_match吃掉匹配正则表达式的字符串;SerializedReader可以用来分离连接的serialize值(如serialize($foo).serialize($bar)),无论它们来自本地Source(如字符串或文件流)还是远程Source(如管道或网络流);它们被明确设计为与远程Source高效工作;JsonReader可以用来分离连接的 JSON(按照 RFC 7159 规定)值,条件与SerializedReader相同。
建议使用 fromSource 静态方法创建 CDataReader:当适用时,它将自动优先选择优化实现(如 StringCDataReader);
Channel;
Channel 对象(实现 ChannelInterface 的对象)可以用来通过消息与远程任务进行通信,必要时进行序列化;
SerializedChannel使用原生 PHP 格式(使用serialize)序列化消息;JsonChannel使用 JSON(按照 RFC 7159 规定)序列化消息。
ChannelFactory 对象(实现 ChannelFactoryInterface 的对象)可以由应用程序或库使用来指定一个编码器/解码器对及其参数,传递给另一个库。
Selectable;
Selectable 对象(实现 SelectableInterface 的对象)是封装 PHP 流的对象。它们可以被传递给 Selectable 类的静态方法,这些方法是面向对象的 stream_select 包装器。这些方法可以查找被任意多个 OuterSource 封装在其中的 Selectable,并在返回时保留原始传递的对象(而不是内嵌的 Selectable);
许多对象都是 Selectable:所有 StreamSource、所有 Channel 和 Selectable 类本身的对象:除了它的静态实用方法之外,它还提供了接口的裸机实现(您可以使用它,例如,将服务器套接字添加到您的集合中)。