流,包装器

流是一个很重要的概念。流的概念源于UNIX中的管道,管道是一条不间断的字节流,用来实现程序和进程间通信,或者读写外设,外部文件等。

我们可以把流比作管道,把水(资源数据)从一个地方引到另一个地方。在水从出发地到目的地的过程中,我们可以过滤水,可以改变水质,可以添加水,也可以排出水。

流是具有流式行为的资源对象,也就是说,流可以线性读写,并且可以通过 fseek() 之类的函数定位到流中的任何位置。文件操作,网络操作,数据压缩操作等具有一定的共性,比如线性的读/写或者随机定位,流就是用来把这些操作抽象出一个统一的接口以供开发者们使用,使用统一的一套流函数统一操作它们。

******

流式数据的种类各异,每种类型需要独特的协议,以便读写数据,我们称这些协议为 流封装协议 。

流封装协议的作用是与 PHP 脚本的标准输入、标准输出和标准错误文件描述符通信。

******

每个流都对应一种包装器。

流是从统一操作这个角度产生的一个概念,而包装器是从理解流数据内容出发产生的一个概念,也就是这个统一的操作方式怎么操作或配置不同的内容

比如http协议传来的数据是流的方式,但只有http包装器才理解http协议传来的数据的意思。

包装器提供取回URL的内容和元数据、添加上下文参数的能力,调整包装器行为。

包装器对stream进行进一步的封装(wrapper),这样就可以handle一些特定的协议。例如http wrapper可以把一个url翻译成对远程服务器上文件的HTTP/1.0请求。

有些 PHP 流能够接受一系列可选的参数,这些参数叫流上下文,用于定制流的行为。

不同的流封装协议使用的流上下文有所不同,流上下文使用 stream_context_create() 函数创建,这个函数返回的上下文对象可以传入大多数文件系统函数。

流上下文是个关联数组,最外层键是流封装协议的名称,流上下文数组中的值针对不同的流封装协议有所不同,可用的设置参考各个 PHP 流封装协议的文档。

******

每个流都有一个协议和一个目标。使用流的方法是是指定协议和目标: <scheme>://<target>  ,其中 <scheme> 是流的封装协议, <target> 是流的数据源。

$json = file_get_contents('http://api.flickr.com/services/feeds/photos_public.gne?format=json')。

不要以为这是普通的网页 URL, file_get_contents() 函数的字符串参数其实是一个流标识符。 http 协议会让 PHP 使用 HTTP 流封装协议,在这个参数中, http 之后是流的目标。

在用fopen、fwrite、fread、fgets、feof、rewind、file_put_contents、file_get_contents等等文件系统函数操作流时,数据是先传给定义的包装器类对象,包装器再去操作流。

******

上下文和参数:上下文是比较宏观的说法,经常用在沟通上面,具体点讲就是一次沟通本身的参数,而参数这个说法往往用在比较具体的事情上面,比如说函数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值