- substr: documentation ( source)
- var_dump: documentation ( source)
<?php
/**
* Implements a read/write buffer.
*/
class Buffer {
protected $eof = false;
protected $indexRead = 0;
protected $indexWrite = 0;
protected $buffer = [];
public function write($bytes) {
if ($bytes === null) {
$this->eof = true;
} else {
$this->buffer[$this->indexWrite++] = $bytes;
}
}
public function read($length = 4096) {
if (!$this->buffer) {
return $this->eof ? null : '';
}
$output = '';
$outputLength = 0;
while ($this->indexRead < $this->indexWrite) {
$chunk = $this->buffer[$this->indexRead];
$chunkLength = \strlen($chunk);
if ($outputLength + $chunkLength == $length) {
unset($this->buffer[$this->indexRead++]);
$output .= $chunk;
return $output;
}
if ($outputLength + $chunkLength > $length) {
$slice = $length - $outputLength;
$this->buffer[$this->indexRead] = \substr($chunk, $slice);
$output .= \substr($chunk, 0, $slice);
return $output;
}
unset($this->buffer[$this->indexRead++]);
$output .= $chunk;
$outputLength += $chunkLength;
}
return $output;
}
}
$b = new Buffer();
$b->write('ABCDEFGHIJ');
$b->write('KLMNOPQRSTUVWXYZ');
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
echo 'Writing more...' . PHP_EOL;
$b->write('01234567890');
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));
echo 'EOF...' . PHP_EOL;
$b->write(null);
var_dump($b->read(3));
var_dump($b->read(3));
var_dump($b->read(3));