Streams 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를 반환합니다.

filter_name이 이미 정의되어 있으면 stream_filter_register()false를 반환합니다.


Examples

예제 #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
                

기타