121 lines
2.9 KiB
PHP
121 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace goodboyalex\php_components_pack\classes;
|
|
|
|
use ArrayAccess;
|
|
use ArrayIterator;
|
|
use Countable;
|
|
use Exception;
|
|
use goodboyalex\php_components_pack\interfaces\ISerializable;
|
|
use IteratorAggregate;
|
|
use Traversable;
|
|
|
|
/**
|
|
* Класс, реализующий функционал кортежей от C#.
|
|
*
|
|
* @author Александр Бабаев
|
|
* @package php_components_pack
|
|
* @version 1.2
|
|
* @since 1.0.20
|
|
*/
|
|
final class Tuple implements ISerializable, ArrayAccess, IteratorAggregate, Countable
|
|
{
|
|
/**
|
|
* @var array Массив значений кортежа.
|
|
*/
|
|
private array $Values;
|
|
|
|
/**
|
|
* Конструктор кортежа.
|
|
*
|
|
* @param mixed ...$values Значения кортежа.
|
|
*/
|
|
public function __construct (...$values)
|
|
{
|
|
$this->Values = $values;
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function Serialize (): string
|
|
{
|
|
return serialize($this->Values);
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function UnSerialize (string $serialized): void
|
|
{
|
|
$this->Values = unserialize($serialized);
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function offsetExists (mixed $offset): bool
|
|
{
|
|
return isset($this->Values[$offset]);
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function offsetGet (mixed $offset): mixed
|
|
{
|
|
// Если ключ не является целым числом
|
|
if (!is_int($offset))
|
|
// - возвращаем null
|
|
return null;
|
|
|
|
// Возвращаем значение кортежа по индексу
|
|
return $this->Get($offset);
|
|
}
|
|
|
|
/**
|
|
* Возвращает значение кортежа по индексу.
|
|
*
|
|
* @param int $index Индекс значения.
|
|
*
|
|
* @return mixed Значение кортежа по индексу.
|
|
*/
|
|
public function Get (int $index): mixed
|
|
{
|
|
return $this->Values[$index] ?? null;
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
* @throws Exception Элементы кортежа не могут быть изменены после создания! / Tuple elements cannot be changed
|
|
* after creation!
|
|
*/
|
|
public function offsetSet (mixed $offset, mixed $value): void
|
|
{
|
|
throw new Exception('Элементы кортежа не могут быть изменены после создания! / Tuple elements cannot be changed after creation!');
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function offsetUnset (mixed $offset): void
|
|
{
|
|
unset($this->Values[$offset]);
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function getIterator (): Traversable
|
|
{
|
|
return new ArrayIterator($this->Values);
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function count (): int
|
|
{
|
|
return count($this->Values);
|
|
}
|
|
} |