matracine /
php-streams
| 1 | <?php declare(strict_types=1); |
||
| 2 | /* |
||
| 3 | * This file is part of mracine/php-streams. |
||
| 4 | * |
||
| 5 | * (c) Matthieu Racine <[email protected]> |
||
| 6 | * |
||
| 7 | * For the full copyright and license information, please view the LICENSE |
||
| 8 | * file that was distributed with this source code. |
||
| 9 | */ |
||
| 10 | namespace mracine\Streams; |
||
| 11 | |||
| 12 | use mracine\Streams\Stream; |
||
| 13 | use mracine\Streams\Exception\StreamException; |
||
| 14 | |||
| 15 | /** |
||
| 16 | * class BufferStream |
||
| 17 | * |
||
| 18 | * Initialized with a string, the read method retreive it as done with fread, consuming the buffer. |
||
| 19 | * When all the buffer has been read, exception is thrown when try to read again. |
||
| 20 | * |
||
| 21 | * @since 0.2.0 |
||
| 22 | */ |
||
| 23 | |||
| 24 | class BufferStream implements Stream |
||
| 25 | { |
||
| 26 | /** |
||
| 27 | * @var string $buffer Stores the string to use when read rhe stream |
||
| 28 | */ |
||
| 29 | protected $buffer; |
||
| 30 | |||
| 31 | /** |
||
| 32 | * Constuctor |
||
| 33 | * |
||
| 34 | * @param string $string the initial data accessible via read method |
||
| 35 | */ |
||
| 36 | 7 | public function __construct(string $string) |
|
| 37 | { |
||
| 38 | 7 | $this->buffer = $string; |
|
| 39 | 7 | } |
|
| 40 | |||
| 41 | /** |
||
| 42 | * {@inheritDoc} |
||
| 43 | */ |
||
| 44 | 6 | public function read(int $length) : string |
|
| 45 | { |
||
| 46 | 6 | if (is_null($this->buffer)) { |
|
|
0 ignored issues
–
show
introduced
by
Loading history...
|
|||
| 47 | 1 | throw new StreamException(sprintf("Cannot read from closed (null) stream")); |
|
| 48 | } |
||
| 49 | |||
| 50 | 5 | $remaining = strlen($this->buffer); |
|
| 51 | |||
| 52 | 5 | if ($length<0) { |
|
| 53 | 1 | throw new \InvalidArgumentException("Cannot read a negative count of bytes from a stream"); |
|
| 54 | } |
||
| 55 | |||
| 56 | 4 | if (0 == $remaining) { |
|
| 57 | 3 | throw new StreamException("End of stream"); |
|
| 58 | } |
||
| 59 | |||
| 60 | 1 | if ($length>=$remaining) { |
|
| 61 | // returns all |
||
| 62 | 1 | $result = $this->buffer; |
|
| 63 | // No more in the buffer |
||
| 64 | 1 | $this->buffer = ''; |
|
| 65 | } else { |
||
| 66 | // acquire $length characters from the buffer |
||
| 67 | 1 | $result = substr($this->buffer, 0, $length); |
|
| 68 | // remove $length characters from the buffer |
||
| 69 | 1 | $this->buffer = substr_replace($this->buffer, '', 0, $length); |
|
|
0 ignored issues
–
show
It seems like
substr_replace($this->buffer, '', 0, $length) can also be of type array. However, the property $buffer is declared as type string. Maybe add an additional type check?
Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly. For example, imagine you have a variable Either this assignment is in error or a type check should be added for that assignment. class Id
{
public $id;
public function __construct($id)
{
$this->id = $id;
}
}
class Account
{
/** @var Id $id */
public $id;
}
$account_id = false;
if (starsAreRight()) {
$account_id = new Id(42);
}
$account = new Account();
if ($account instanceof Id)
{
$account->id = $account_id;
}
Loading history...
|
|||
| 70 | } |
||
| 71 | |||
| 72 | 1 | return $result; |
|
| 73 | } |
||
| 74 | |||
| 75 | /** |
||
| 76 | * Fake write method, do nothing except return the pseudo "writen" length, i.e. the length of data |
||
| 77 | * |
||
| 78 | * {@inheritDoc} |
||
| 79 | */ |
||
| 80 | 14 | public function write(string $data, $length = null) : int |
|
| 81 | { |
||
| 82 | 14 | if (is_null($this->buffer)) { |
|
|
0 ignored issues
–
show
|
|||
| 83 | 1 | throw new StreamException(sprintf("Cannot write to closed (null) stream")); |
|
| 84 | } |
||
| 85 | |||
| 86 | 13 | if (is_null($length)) { |
|
| 87 | 3 | $length = strlen($data); |
|
| 88 | } |
||
| 89 | |||
| 90 | 13 | if ($length<0) { |
|
| 91 | 1 | throw new \InvalidArgumentException("Cannot write a negative count of bytes"); |
|
| 92 | } |
||
| 93 | |||
| 94 | 12 | return min($length, strlen($data)); |
|
| 95 | } |
||
| 96 | |||
| 97 | /** |
||
| 98 | * {@inheritDoc} |
||
| 99 | */ |
||
| 100 | 1 | public function close() |
|
| 101 | { |
||
| 102 | 1 | $this->buffer = null; |
|
| 103 | 1 | } |
|
| 104 | } |
||
| 105 |