stream_filter_register
(PHP 5, PHP 7)
stream_filter_register - 注册用户定义的流过滤器
描述
bool stream_filter_register ( string $filtername , string $classname )
stream_filter_register()允许你在所有其他文件系统函数(如fopen(),fread()等)使用的注册流上实现自己的过滤器。
参数
filtername
要注册的过滤器名称。
classname
要实现一个过滤器,你需要定义一个类作为php_user_filter的一个扩展,并带有许多成员函数。在对过滤器所连接的流执行读/写操作时,PHP将通过过滤器(以及附加到该流的任何其他过滤器)传递数据,以便可以根据需要修改数据。您必须完全按照php_user_filter中的描述来实现这些方法 - 否则会导致未定义的行为。
返回值
成功时返回TRUE
或失败时返回FALSE
。
如果filtername
已经定义,stream_filter_register()将返回FALSE
。
示例
Example#1过滤大小foo-bar.txt流上的字符
下面的示例在foo-bar.txt流上实现名为strtoupper的过滤器,该过滤器将大写写入/读取该流的所有字母字符。
<?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
示例#2注册一个通用过滤器类以匹配多个过滤器名称。
<?php
/*?Define?our?filter?class?*/
class?string_filter?extends?php_user_filter?{
??var?$mode;
??function?filter($in,?$out,?&$consumed,?$closing)
??{
????while?($bucket?=?stream_bucket_make_writeable($in))?{
??????if?($this->mode?==?1)?{
????????$bucket->data?=?strtoupper($bucket->data);
??????}?elseif?($this->mode?==?0)?{
????????$bucket->data?=?strtolower($bucket->data);
??????}
??????$consumed?+=?$bucket->datalen;
??????stream_bucket_append($out,?$bucket);
????}
????return?PSFS_PASS_ON;
??}
??function?onCreate()
??{
????if?($this->filtername?==?'str.toupper')?{
??????$this->mode?=?1;
????}?elseif?($this->filtername?==?'str.tolower')?{
??????$this->mode?=?0;
????}?else?{
??????/*?Some?other?str.*?filter?was?asked?for,
?????????report?failure?so?that?PHP?will?keep?looking?*/
??????return?false;
????}
????return?true;
??}
}
/*?Register?our?filter?with?PHP?*/
stream_filter_register("str.*",?"string_filter")
????or?die("Failed?to?register?filter");
$fp?=?fopen("foo-bar.txt",?"w");
/*?Attach?the?registered?filter?to?the?stream?just?opened
???We?could?alternately?bind?to?str.tolower?here?*/
stream_filter_append($fp,?"str.toupper");
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
另请参阅
- stream_wrapper_register() - 注册一个实现为PHP类的URL包装器
- stream_filter_append() - 将过滤器附加到流中
- stream_filter_prepend() - 将过滤器附加到流中
← stream_filter_prepend
stream_filter_remove →
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com