此包已废弃,不再维护。未建议替代包。

面向对象的I/O设施

0.2.0 2016-08-16 17:43 UTC

This package is auto-updated.

Last update: 2020-02-09 03:41:22 UTC


README

Build Status Scrutinizer Code Quality

EXSyst I/O组件

面向对象的I/O设施

对象(实现SourceInterface的对象)可以用来从多个来源读取原始数据块

  • StringSource可用于从字符串读取数据;
  • StreamSource可用于从PHP流资源读取数据,**但不提供对封装PHP流实现中大多数缺陷的保护**;如果流是可写的或双向的,它们也可以用作Sink(下一节将详细介绍);
  • BufferedSource可用于包装其他源,以修复它们实现中可能存在的缺陷,并添加缺失的功能(例如,你是否已经需要过,哪怕只是一次,在套接字上向后搜索?);
  • OuterSource是抽象的:您可以扩展它们以在现有Source上提供附加服务(例如,BufferedSourceReaderOuterSource)。

您可以直接从类的构造函数创建Source,或使用Source类的静态方法,这些方法可能提供附加服务(例如,fromStreamfromFile默认将StreamSource包装在BufferedSource中)。

Source类还提供了静态实用方法。

对象(实现SinkInterface的对象)可以用来将原始数据块写入多个汇

  • StringSink可用于构建字符串(但可能比普通连接更快:注意调用开销!);
  • SystemSinkecho的一个简单包装器;它是一个单例;
  • 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、所有 ChannelSelectable 类本身的对象:除了它的静态实用方法之外,它还提供了接口的裸机实现(您可以使用它,例如,将服务器套接字添加到您的集合中)。