Chris@0: attach($callback); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function __toString() Chris@0: { Chris@0: return $this->getContents(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function close() Chris@0: { Chris@0: $this->callback = null; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function detach() Chris@0: { Chris@0: $callback = $this->callback; Chris@0: $this->callback = null; Chris@0: return $callback; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Attach a new callback to the instance. Chris@0: * Chris@0: * @param callable $callback Chris@0: * @throws InvalidArgumentException for callable callback Chris@0: */ Chris@0: public function attach(callable $callback) Chris@0: { Chris@0: $this->callback = $callback; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getSize() Chris@0: { Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function tell() Chris@0: { Chris@0: throw new RuntimeException('Callback streams cannot tell position'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function eof() Chris@0: { Chris@0: return empty($this->callback); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function isSeekable() Chris@0: { Chris@0: return false; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function seek($offset, $whence = SEEK_SET) Chris@0: { Chris@0: throw new RuntimeException('Callback streams cannot seek position'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function rewind() Chris@0: { Chris@0: throw new RuntimeException('Callback streams cannot rewind position'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function isWritable() Chris@0: { Chris@0: return false; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function write($string) Chris@0: { Chris@0: throw new RuntimeException('Callback streams cannot write'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function isReadable() Chris@0: { Chris@0: return false; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function read($length) Chris@0: { Chris@0: throw new RuntimeException('Callback streams cannot read'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getContents() Chris@0: { Chris@0: $callback = $this->detach(); Chris@0: return $callback ? $callback() : ''; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getMetadata($key = null) Chris@0: { Chris@0: $metadata = [ Chris@0: 'eof' => $this->eof(), Chris@0: 'stream_type' => 'callback', Chris@0: 'seekable' => false Chris@0: ]; Chris@0: Chris@0: if (null === $key) { Chris@0: return $metadata; Chris@0: } Chris@0: Chris@0: if (! array_key_exists($key, $metadata)) { Chris@0: return null; Chris@0: } Chris@0: Chris@0: return $metadata[$key]; Chris@0: } Chris@0: }