php中stream_filter_register的用法介绍

PHP 投稿 51600 0 评论

php中stream_filter_register的用法介绍

Stream是PHP开发里最容易被忽视的函数系列(SPL系列,Stream系列,pack函数,封装协议)之一,但其是个很有用也很重要的函数。Stream可以翻译为“流”,在Java里,流是一个很重要的概念。

流(stream)的概念源于UNIX中管道(pipe)的概念。在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备、外部文件等。根据流的方向又可以分为输入流和输出流,同时可以在其外围再套上其它流,比如缓冲流,这样就可以得到更多流处理方法。

PHP里的流和Java里的流实际上是同一个概念,只是简单了一点。由于PHP主要用于Web开发,所以“流”这块的概念被提到的较少。如果有Java基础,对于PHP里的流就更容易理解了。其实PHP里的许多高级特性,比如SPL,异常,过滤器等都参考了Java的实现,在理念和原理上同出一辙。

stream_filter_register

版本支持(PHP 5、PHP 7、PHP 8)

stream_filter_register —注册用户定义的流过滤器

说明

stream_filter_register ( string $filter_name , string $class ): bool

stream_filter_register()允许您在与所有其他文件系统函数(例如fopen()、 fread()等)一起使用的任何注册流上实现您自己的过滤器。

参数

filter_name 

要注册的过滤器名称。

class

要实现过滤器,您需要定义一个类作为具有多个成员函数的php_user_filter的扩展 。当对过滤器附加到的流执行读/写操作时,PHP 将通过您的过滤器(以及附加到该流的任何其他过滤器)传递数据,以便可以根据需要修改数据。您必须完全按照 php_user_filter 中的描述实现方法- 否则将导致未定义的行为。

返回值

成功时返回 true, 或者在失败时返回 false。

false如果 filter_name 已经定义, stream_filter_register() 将返回。

示例 

过滤 foo-bar.txt 流中的大写字符

下面的示例实现了一个 strtoupper 在 foo-bar.txt 流上命名的过滤器,它将大写写入/读取该流的所有字母字符。

<?php

/* Define our filter class */

class strtoupper_filter extends php_user_filter {
    function filter($in, $out, &$consumed, $closing) {
        while ($bucket = stream_bucket_make_writeable($in)) {
            $bucket->data = strtoupper($bucket->data);
            $consumed += $bucket->datalen;
            stream_bucket_append($out, $bucket);
        }
        return PSFS_PASS_ON;
    }
}

/* Register our filter with PHP */
stream_filter_register("strtoupper", "strtoupper_filter")
or die("Failed to register filter");

$fp = fopen("foo-bar.txt", "w");

/* Attach the registered filter to the stream just opened */
stream_filter_append($fp, "strtoupper");

fwrite($fp, "Line1\n");
fwrite($fp, "Word - 2\n");
fwrite($fp, "Easy As 123\n");

fclose($fp);

/* Read the contents back out
 */
readfile("foo-bar.txt");

以上例程会输出:

LINE1
WORD - 2
EASY AS 123

PHP中的stream流系列函数中还有一个很重要的流,就是包装类流 streamWrapper。使用包装流可以使得不同类型的协议使用相同的接口操纵数据。

编程笔记 » php中stream_filter_register的用法介绍

赞同 (102) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽