shell bypass 403
<?php declare(strict_types=1); namespace smpp; use ArrayIterator; use IteratorIterator; use smpp\exceptions\InvalidCollectionItem; /** * Class Collection * @package smpp * * all item classes must implements ItemInterface */ class Collection extends IteratorIterator { /** @var class-string class name of items */ public const CLASSNAME = ItemInterface::class; /** @var ItemInterface[] */ public array $items = []; /** * Collection constructor. * * @param bool $strict in strict mode on invalid collection item will be thrown an Exception * @param ItemInterface ...$items * * @throws InvalidCollectionItem */ public function __construct( public bool $strict = false, ItemInterface ...$items, ) { $this->addItems($items); parent::__construct(new ArrayIterator($this->items)); } /** * Add item to collection * * @param ItemInterface $item * * @throws InvalidCollectionItem */ public function addItem(ItemInterface $item): void { /** @var class-string $classname */ $classname = static::CLASSNAME; if ($item instanceof $classname) { $this->items[] = $item; } else { if ($this->strict) { throw new InvalidCollectionItem('Invalid item of collection'); } } } /** * @param ItemInterface[] $items * @throws InvalidCollectionItem */ public function addItems(array $items): void { foreach ($items as $item) { $this->addItem($item); } } /** * remove last element from collection */ public function pop(): void { unset($this->items[$this->count() - 1]); } /** * count items in collection * @return int */ public function count(): int { return count($this->items); } /** * cleanup collection (remove all elements) */ public function clear(): void { $this->items = []; } /** * Shuffle items in collection * @return void */ public function shuffle(): void { shuffle($this->items); } /** * @return string */ public function __toString(): string { return serialize($this->items); } }