Класс streamWrapper

(PHP 4 >= 4.3.2, PHP 5, PHP 7)

Введение

Позволяет реализовывать собственные обработчики протоколов и потоков для дальнейшего использования со всеми функциями по работе с файловой системой (такими как fopen(), fread() и т.п.).

Замечание:

Это НЕ реальный класс, а лишь прототип, предоставленный в качестве наглядного пособия.

Замечание:

Реализация методов, отличная от описанной здесь, может привести к нестабильному поведению.

Объект класса инициализируется в тот момент, когда потоковая функция пытается получить доступ к протоколу, с которым этот класс ассоциирован.

Обзор классов

streamWrapper {
/* Свойства */
public resource $context ;
/* Методы */
__construct ( void )
__destruct ( void )
public bool dir_closedir ( void )
public bool dir_opendir ( string $path , int $options )
public string dir_readdir ( void )
public bool dir_rewinddir ( void )
public bool mkdir ( string $path , int $mode , int $options )
public bool rename ( string $path_from , string $path_to )
public bool rmdir ( string $path , int $options )
public resource stream_cast ( int $cast_as )
public void stream_close ( void )
public bool stream_eof ( void )
public bool stream_flush ( void )
public bool stream_lock ( int $operation )
public bool stream_metadata ( string $path , int $option , mixed $value )
public bool stream_open ( string $path , string $mode , int $options , string &$opened_path )
public string stream_read ( int $count )
public bool stream_seek ( int $offset , int $whence = SEEK_SET )
public bool stream_set_option ( int $option , int $arg1 , int $arg2 )
public array stream_stat ( void )
public int stream_tell ( void )
public bool stream_truncate ( int $new_size )
public int stream_write ( string $data )
public bool unlink ( string $path )
public array url_stat ( string $path , int $flags )
}

Свойства

resource context

Текущий контекстили NULL, если в вызывающую функцию не было передано никакого контекста.

Используйте функцию stream_context_get_options() для анализа и разбора контекста.

Замечание:

Это свойство должно быть общедоступным (иметь модификатор public), чтобы PHP мог ассоциировать его с актуальным контекстом.

Список изменений

Версия Описание
5.0.0 Добавлено свойство context.

Содержание

Коментарии

a php interface for wrapper

<?php
interface WrapperInterface
{
   
/**
     * resource context
     *
     * @var resource
     */
    //public $context;

    /**
     * constructor
     *
     */
   
public function __construct();

   
/**
     *
     *
     * @return bool
     */
   
public function dir_closedir();

   
/**
     * Enter description here...
     *
     * @param string $path
     * @param int $options
     * @return bool
     */
   
public function dir_opendir($path $options);

   
/**
     * Enter description here...
     *
     * @return string
     */
   
public function dir_readdir();

   
/**
     * Enter description here...
     *
     * @return bool
     */
   
public function dir_rewinddir();

   
/**
     * Enter description here...
     *
     * @param string $path
     * @param int $mode
     * @param int $options
     * @return bool
     */
   
public function mkdir($path $mode $options);

   
/**
     * Enter description here...
     *
     * @param string $path_from
     * @param string $path_to
     * @return bool
     */
   
public function rename($path_from $path_to);

   
/**
     * Enter description here...
     *
     * @param string $path
     * @param int $options
     * @return bool
     */
   
public function rmdir($path $options);

   
/**
     * Enter description here...
     *
     * @param int $cast_as
     * @return resource
     */
   
public function stream_cast($cast_as);

   
/**
     * Enter description here...
     *
     */
   
public function stream_close();

   
/**
     * Enter description here...
     *
     * @return bool
     */
   
public function stream_eof();

   
/**
     * Enter description here...
     *
     * @return bool
     */
   
public function stream_flush();

   
/**
     * Enter description here...
     *
     * @param mode $operation
     * @return bool
     */
   
public function stream_lock($operation);

   
/**
     * Enter description here...
     *
     * @param string $path
     * @param string $mode
     * @param int $options
     * @param string &$opened_path
     * @return bool
     */
   
public function stream_open($path $mode $options , &$opened_path);

   
/**
     * Enter description here...
     *
     * @param int $count
     * @return string
     */
   
public function stream_read($count);

   
/**
     * Enter description here...
     *
     * @param int $offset
     * @param int $whence = SEEK_SET
     * @return bool
     */
   
public function stream_seek($offset $whence SEEK_SET);

   
/**
     * Enter description here...
     *
     * @param int $option
     * @param int $arg1
     * @param int $arg2
     * @return bool
     */
   
public function stream_set_option($option $arg1 $arg2);

   
/**
     * Enter description here...
     *
     * @return array
     */
   
public function stream_stat();

   
/**
     * Enter description here...
     *
     * @return int
     */
   
public function stream_tell();

   
/**
     * Enter description here...
     *
     * @param string $data
     * @return int
     */
   
public function stream_write($data);

   
/**
     * Enter description here...
     *
     * @param string $path
     * @return bool
     */
   
public function unlink($path);

   
/**
     * Enter description here...
     *
     * @param string $path
     * @param int $flags
     * @return array
     */
   
public function url_stat($path $flags);
}

?>
2009-07-17 05:38:09
http://php5.kiev.ua/manual/ru/class.streamwrapper.html
It's worth noting that the interface defined by yannick at gmail should not always be implemented by a stream wrapper class, as several of the methods should not be implemented if the class has no use for them (as per the manual). 

Specifically, mkdir, rename, rmdir, and unlink are methods that "should not be defined" if the wrapper has no use for them. The consequence is that the appropriate error message will not be returned. 

If the interface is implemented, you won't have the flexibility to not implement those methods.

Not trying to be academic, but it was useful for me.
2010-10-22 12:12:57
http://php5.kiev.ua/manual/ru/class.streamwrapper.html
Автор:
Here is a very simple stream wrapper which calls your callback function for reads:

<?php

class CallbackUrl
{
    const 
WRAPPER_NAME 'callback';

    public 
$context;
    private 
$_cb;
    private 
$_eof false;

    private static 
$_isRegistered false;

    public static function 
getContext($cb)
    {
        if (!
self::$_isRegistered) {
           
stream_wrapper_register(self::WRAPPER_NAMEget_class());
           
self::$_isRegistered true;
        }
        if (!
is_callable($cb)) return false;
        return 
stream_context_create(array(self::WRAPPER_NAME => array('cb' => $cb)));
    }

    public function 
stream_open($path$mode$options, &$opened_path)
    {
        if (!
preg_match('/^r[bt]?$/'$mode) || !$this->context) return false;
       
$opt stream_context_get_options($this->context);
        if (!
is_array($opt[self::WRAPPER_NAME]) ||
            !isset(
$opt[self::WRAPPER_NAME]['cb']) ||
            !
is_callable($opt[self::WRAPPER_NAME]['cb'])) return false;
       
$this->_cb $opt[self::WRAPPER_NAME]['cb'];
        return 
true;
    }

    public function 
stream_read($count)
    {
        if (
$this->_eof || !$count) return '';
        if ((
$s call_user_func($this->_cb$count)) == ''$this->_eof true;
        return 
$s;
    }

    public function 
stream_eof()
    {
        return 
$this->_eof;
    }
}

class 
Test {
    private 
$_s;
    public function 
__construct($s)
    {
       
$this->_s $s;
    }
    public function 
read($count) {
        return 
fread($this->_s$count);
    }
}

$t = new Test(fopen('/etc/services''r'));
$fd fopen('callback://''r'falseCallbackUrl::getContext(array($t'read')));
while((
$buf fread($fd128)) != '') {
    print 
$buf;
}
?>
2011-09-21 15:02:36
http://php5.kiev.ua/manual/ru/class.streamwrapper.html
THIS METHODS NOT REQUIRED, you can implement only part of their: directories, files, etc. 
For example, "glob://" support minimal syntax, glob() more powerful, you can replace/extend native wrapper: check options in table https://www.php.net/manual/ru/wrappers.glob , you need create wrapper only with 'dir_...dir' methods. For more info, see https://www.php.net/manual/en/class.globiterator.php#125220
2020-07-29 14:09:31
http://php5.kiev.ua/manual/ru/class.streamwrapper.html

    Поддержать сайт на родительском проекте КГБ