You are here

trait StreamDecoratorTrait in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php \GuzzleHttp\Psr7\StreamDecoratorTrait

Stream decorator trait @property StreamInterface stream

Hierarchy

1 file declares its use of StreamDecoratorTrait
StreamDecoratorTraitTest.php in vendor/guzzlehttp/psr7/tests/StreamDecoratorTraitTest.php

File

vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php, line 10

Namespace

GuzzleHttp\Psr7
View source
trait StreamDecoratorTrait {

  /**
   * @param StreamInterface $stream Stream to decorate
   */
  public function __construct(StreamInterface $stream) {
    $this->stream = $stream;
  }

  /**
   * Magic method used to create a new stream if streams are not added in
   * the constructor of a decorator (e.g., LazyOpenStream).
   *
   * @param string $name Name of the property (allows "stream" only).
   *
   * @return StreamInterface
   */
  public function __get($name) {
    if ($name == 'stream') {
      $this->stream = $this
        ->createStream();
      return $this->stream;
    }
    throw new \UnexpectedValueException("{$name} not found on class");
  }
  public function __toString() {
    try {
      if ($this
        ->isSeekable()) {
        $this
          ->seek(0);
      }
      return $this
        ->getContents();
    } catch (\Exception $e) {

      // Really, PHP? https://bugs.php.net/bug.php?id=53648
      trigger_error('StreamDecorator::__toString exception: ' . (string) $e, E_USER_ERROR);
      return '';
    }
  }
  public function getContents() {
    return copy_to_string($this);
  }

  /**
   * Allow decorators to implement custom methods
   *
   * @param string $method Missing method name
   * @param array  $args   Method arguments
   *
   * @return mixed
   */
  public function __call($method, array $args) {
    $result = call_user_func_array([
      $this->stream,
      $method,
    ], $args);

    // Always return the wrapped object if the result is a return $this
    return $result === $this->stream ? $this : $result;
  }
  public function close() {
    $this->stream
      ->close();
  }
  public function getMetadata($key = null) {
    return $this->stream
      ->getMetadata($key);
  }
  public function detach() {
    return $this->stream
      ->detach();
  }
  public function getSize() {
    return $this->stream
      ->getSize();
  }
  public function eof() {
    return $this->stream
      ->eof();
  }
  public function tell() {
    return $this->stream
      ->tell();
  }
  public function isReadable() {
    return $this->stream
      ->isReadable();
  }
  public function isWritable() {
    return $this->stream
      ->isWritable();
  }
  public function isSeekable() {
    return $this->stream
      ->isSeekable();
  }
  public function rewind() {
    $this
      ->seek(0);
  }
  public function seek($offset, $whence = SEEK_SET) {
    $this->stream
      ->seek($offset, $whence);
  }
  public function read($length) {
    return $this->stream
      ->read($length);
  }
  public function write($string) {
    return $this->stream
      ->write($string);
  }

  /**
   * Implement in subclasses to dynamically create streams when requested.
   *
   * @return StreamInterface
   * @throws \BadMethodCallException
   */
  protected function createStream() {
    throw new \BadMethodCallException('Not implemented');
  }

}

Members

Namesort descending Modifiers Type Description Overrides
StreamDecoratorTrait::close public function 1
StreamDecoratorTrait::createStream protected function Implement in subclasses to dynamically create streams when requested. 2
StreamDecoratorTrait::detach public function
StreamDecoratorTrait::eof public function 2
StreamDecoratorTrait::getContents public function
StreamDecoratorTrait::getMetadata public function
StreamDecoratorTrait::getSize public function 2
StreamDecoratorTrait::isReadable public function
StreamDecoratorTrait::isSeekable public function 1
StreamDecoratorTrait::isWritable public function 1
StreamDecoratorTrait::read public function 2
StreamDecoratorTrait::rewind public function 1
StreamDecoratorTrait::seek public function 3
StreamDecoratorTrait::tell public function 1
StreamDecoratorTrait::write public function 2
StreamDecoratorTrait::__call public function Allow decorators to implement custom methods
StreamDecoratorTrait::__construct public function 7
StreamDecoratorTrait::__get public function Magic method used to create a new stream if streams are not added in the constructor of a decorator (e.g., LazyOpenStream).
StreamDecoratorTrait::__toString public function