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