streamWrapper 类
(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)
简介
允许实现自定义协议处理程序和流,以便与其它文件系统函数(比如 fopen()、 fread() 等)一起使用。
注意:
这不是真实的类,只是如何定义协议的原型类。
注意:
不使用此处描述的方法而使用其它方式可能会导致未定义行为。
一旦流函数尝试访问与其关联的协议,就会初始化此类的实例。
类摘要
属性
- 资源 context
-
当前 context,或者没有 context 传递给调用函数,则为
null
。使用 stream_context_get_options() 解析 context。
注意:
此属性必须是 public,以便 PHP 可以使用使用实际的 context 资源填充它。
目录
- streamWrapper::__construct — Constructs a new stream wrapper
- streamWrapper::__destruct — Destructs an existing stream wrapper
- streamWrapper::dir_closedir — Close directory handle
- streamWrapper::dir_opendir — Open directory handle
- streamWrapper::dir_readdir — Read entry from directory handle
- streamWrapper::dir_rewinddir — Rewind directory handle
- streamWrapper::mkdir — Create a directory
- streamWrapper::rename — Renames a file or directory
- streamWrapper::rmdir — Removes a directory
- streamWrapper::stream_cast — Retrieve the underlaying resource
- streamWrapper::stream_close — Close a resource
- streamWrapper::stream_eof — Tests for end-of-file on a file pointer
- streamWrapper::stream_flush — Flushes the output
- streamWrapper::stream_lock — Advisory file locking
- streamWrapper::stream_metadata — Change stream metadata
- streamWrapper::stream_open — Opens file or URL
- streamWrapper::stream_read — Read from stream
- streamWrapper::stream_seek — Seeks to specific location in a stream
- streamWrapper::stream_set_option — Change stream options
- streamWrapper::stream_stat — Retrieve information about a file resource
- streamWrapper::stream_tell — Retrieve the current position of a stream
- streamWrapper::stream_truncate — Truncate stream
- streamWrapper::stream_write — Write to stream
- streamWrapper::unlink — Delete a file
- streamWrapper::url_stat — Retrieve information about a file
+添加备注
用户贡献的备注 4 notes
isaac dot z dot no dot foster at spam dot gmail dot please dot com ¶
14 years ago
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.
info at ensostudio dot ru ¶
4 years ago
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
Anonymous ¶
13 years ago
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_NAME, get_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', false, CallbackUrl::getContext(array($t, 'read')));
while(($buf = fread($fd, 128)) != '') {
print $buf;
}
?>
yannick dot battail at gmail dot com ¶
15 years ago
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);
}
?>