20250721 1.2 Бета 1
This commit is contained in:
parent
2c3ea12fc1
commit
04f6849ff4
@ -1,147 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\extensions;
|
||||
|
||||
use Random\RandomException;
|
||||
|
||||
/**
|
||||
* Расширение Guid.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.0
|
||||
*/
|
||||
final class GUIDExtension
|
||||
{
|
||||
/**
|
||||
* Пустой Guid.
|
||||
*/
|
||||
public const string GUIDEmpty = "00000000-0000-0000-0000-000000000000";
|
||||
|
||||
/**
|
||||
* Генерирует Guid.
|
||||
*
|
||||
* @return string Сгенерированный Guid.
|
||||
*/
|
||||
public static function Generate (): string
|
||||
{
|
||||
// Цикл создания Guid
|
||||
do
|
||||
$guid = self::DoGenerate();
|
||||
// - пока Guid не будет корректен
|
||||
while (!self::Validate($guid));
|
||||
|
||||
// Возвращаем Guid
|
||||
return $guid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Генерирует Guid.
|
||||
*
|
||||
* @return string Сгенерированный Guid.
|
||||
*/
|
||||
private static function DoGenerate (): string
|
||||
{
|
||||
try {
|
||||
return sprintf(
|
||||
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
|
||||
// 32 bits for "time_low"
|
||||
random_int(0, 0xffff),
|
||||
random_int(0, 0xffff),
|
||||
|
||||
// 16 bits for "time_mid"
|
||||
random_int(0, 0xffff),
|
||||
|
||||
// 16 bits for "time_hi_and_version",
|
||||
// four most significant bits holds version number 4
|
||||
random_int(0, 0x0fff) | 0x4000,
|
||||
|
||||
// 16 bits, 8 bits for "clk_seq_hi_res",
|
||||
// 8 bits for "clk_seq_low",
|
||||
// two most significant bits holds zero and one for variant DCE1.1
|
||||
random_int(0, 0x3fff) | 0x8000,
|
||||
|
||||
// 48 bits for "node"
|
||||
random_int(0, 0xffff),
|
||||
random_int(0, 0xffff),
|
||||
random_int(0, 0xffff)
|
||||
);
|
||||
}
|
||||
catch (RandomException) {
|
||||
return self::GUIDEmpty;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет Guid на корректность.
|
||||
*
|
||||
* @param string|null $str Guid на проверку
|
||||
*
|
||||
* @return bool Корректен ли Guid.
|
||||
*/
|
||||
public static function Validate (?string $str): bool
|
||||
{
|
||||
// Если Guid пустой
|
||||
if (StringExtension::IsNullOrWhitespace($str))
|
||||
// - возвращаем false
|
||||
return false;
|
||||
|
||||
// Проверяем длину
|
||||
$isLenCorrect = strlen($str) == 36;
|
||||
|
||||
// Если длина не корректна
|
||||
if (!$isLenCorrect)
|
||||
// - возвращаем false
|
||||
return false;
|
||||
|
||||
// Разбиваем на части
|
||||
$explodedStr = explode("-", $str);
|
||||
|
||||
// Если количество частей не равно 5
|
||||
if (count($explodedStr) !== 5)
|
||||
// - возвращаем false
|
||||
return false;
|
||||
|
||||
// Проверяем длину каждой части
|
||||
// - первая часть должна быть длиной 8 символов
|
||||
if (strlen($explodedStr[0]) !== 8)
|
||||
// -- возвращаем false
|
||||
return false;
|
||||
|
||||
// - вторая часть должна быть длиной 4 символа
|
||||
if (strlen($explodedStr[1]) !== 4)
|
||||
// -- возвращаем false
|
||||
return false;
|
||||
|
||||
// - третья часть должна быть длиной 4 символа
|
||||
if (strlen($explodedStr[2]) !== 4)
|
||||
// -- возвращаем false
|
||||
return false;
|
||||
|
||||
// - четвертая часть должна быть длиной 4 символа
|
||||
if (strlen($explodedStr[3]) !== 4)
|
||||
// -- возвращаем false
|
||||
return false;
|
||||
|
||||
// - пятая часть должна быть длиной 12 символов
|
||||
if (strlen($explodedStr[4]) !== 12)
|
||||
// -- возвращаем false
|
||||
return false;
|
||||
|
||||
// Проверка пройдена
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет Guid на пустоту.
|
||||
*
|
||||
* @param string|null $str Guid на проверку
|
||||
*
|
||||
* @return bool Пустой ли GUID
|
||||
*/
|
||||
public static function IsNotValidOrEmpty (?string $str): bool
|
||||
{
|
||||
return !self::Validate($str) || $str == self::GUIDEmpty;
|
||||
}
|
||||
}
|
43
sources/interfaces/IComparable.php
Normal file
43
sources/interfaces/IComparable.php
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\interfaces;
|
||||
|
||||
/**
|
||||
* Интерфейс, указывающий, что класс можно сравнивать.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package freecms
|
||||
* @version 0.1
|
||||
* @since 1.2
|
||||
*/
|
||||
interface IComparable
|
||||
{
|
||||
/**
|
||||
* Сравнивает объекты текущего класса с другим, переданным в <code>$other</code>.
|
||||
*
|
||||
* @param mixed $other Второй класс для сравнения.
|
||||
*
|
||||
* @return int Возвращает результат сравнения. <code>0</code>, если GUID равны, <code>-1</code>, если текущий GUID
|
||||
* меньше, чем второй и <code>1</code>, если текущий GUID больше другого.
|
||||
*/
|
||||
public function CompareTo (mixed $other): int;
|
||||
|
||||
/**
|
||||
* Сравнивает на равенство текущий класс с другим, переданным в <code>$other</code>.
|
||||
*
|
||||
* @param mixed $other Второй класс для сравнения.
|
||||
*
|
||||
* @return bool Результат сравнения: <code>true</code>, если оба класса равны и <code>false</code>, если нет.
|
||||
*/
|
||||
public function IsEqualsTo (mixed $other): bool;
|
||||
|
||||
/**
|
||||
* Сравнение объектов по указанному свойству.
|
||||
*
|
||||
* @param string $propertyName Название свойства для сравнения.
|
||||
* @param mixed $other Объект для сравнения.
|
||||
*
|
||||
* @return int Результат сравнения: <code>-1</code>, <code>0</code> или <code>1</code>.
|
||||
*/
|
||||
public function CompareByProperty (string $propertyName, mixed $other): int;
|
||||
}
|
21
sources/interfaces/IHashable.php
Normal file
21
sources/interfaces/IHashable.php
Normal file
@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\interfaces;
|
||||
|
||||
/**
|
||||
* Интерфейс, указывающий, что у класса можно получить хэш.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package freecms
|
||||
* @version 0.1
|
||||
* @since 1.2
|
||||
*/
|
||||
interface IHashable
|
||||
{
|
||||
/**
|
||||
* Возвращает хеш-значение класса.
|
||||
*
|
||||
* @return string Хеш-значение класса.
|
||||
*/
|
||||
public function Hash (): string;
|
||||
}
|
37
sources/interfaces/ISortable.php
Normal file
37
sources/interfaces/ISortable.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\interfaces;
|
||||
|
||||
/**
|
||||
* Интерфейс, указывающий, что класс можно сортировать.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package freecms
|
||||
* @version 0.1
|
||||
* @since 1.2
|
||||
*/
|
||||
interface ISortable extends IHashable
|
||||
{
|
||||
/**
|
||||
* Сортирует элементы класса.
|
||||
*
|
||||
* @param string $property Название свойства, по которому нужно отсортировать. Если пусто, то сортировка должна
|
||||
* происходить по хешу. По умолчанию - пустая строка.
|
||||
* @param bool $descending Направление сортировки: <code>true</code> - по убыванию, <code>false</code> - по
|
||||
* возрастанию. По умолчанию - по возрастанию.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function Sort (string $property = '', bool $descending = false): void;
|
||||
|
||||
/**
|
||||
* Сортирует элементы класса по заданной функции.
|
||||
*
|
||||
* @param callable $propertyFunction Функция, возвращающая значение свойства для сортировки.
|
||||
* @param bool $descending Направление сортировки: <code>true</code> - по убыванию, <code>false</code> - по
|
||||
* возрастанию. По умолчанию - по возрастанию.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function SortCallback (callable $propertyFunction, bool $descending = false): void;
|
||||
}
|
43
sources/traits/GUID/GUIDArrayableTrait.php
Normal file
43
sources/traits/GUID/GUIDArrayableTrait.php
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\traits\GUID;
|
||||
|
||||
use goodboyalex\php_components_pack\exceptions\TypeException;
|
||||
use goodboyalex\php_components_pack\types\GUID;
|
||||
|
||||
/**
|
||||
* Часть кода класса GUID, отвечающая за реализацию интерфейса IArrayable.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.2
|
||||
*/
|
||||
trait GUIDArrayableTrait
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function ToArray (): array
|
||||
{
|
||||
return [
|
||||
"type_class" => GUID::class,
|
||||
"value" => $this->Value
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
* @throws TypeException Если тип не соответствует.
|
||||
*/
|
||||
public function FromArray (array $array): void
|
||||
{
|
||||
// Проверка типа
|
||||
if (!isset($array["type_class"]) || $array["type_class"] != GUID::class)
|
||||
// - если тип не соответствует, выбрасываем исключение
|
||||
throw new TypeException($array["type_class"] ?? "", 'Неверный тип данных / Wrong data type.');
|
||||
|
||||
// Получаем значение GUID
|
||||
$this->Value = $array["value"];
|
||||
}
|
||||
}
|
56
sources/traits/GUID/GUIDComparableTrait.php
Normal file
56
sources/traits/GUID/GUIDComparableTrait.php
Normal file
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\traits\GUID;
|
||||
|
||||
use Deprecated;
|
||||
|
||||
/**
|
||||
* Часть кода класса GUID, отвечающая за реализацию интерфейса IComparable.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.2
|
||||
*/
|
||||
trait GUIDComparableTrait
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function IsEqualsTo (mixed $other): bool
|
||||
{
|
||||
return $this->Value === $other->ToString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function CompareTo (mixed $other): int
|
||||
{
|
||||
// Сравниваем строковые значения GUID
|
||||
$compareResult = strcmp($this->Value, $other->ToString());
|
||||
|
||||
// Возвращаем результат сравнения
|
||||
// - если текущий GUID меньше, чем второй
|
||||
if ($compareResult < 0)
|
||||
// - возвращаем -1
|
||||
return -1;
|
||||
// - если текущий GUID больше, чем второй
|
||||
else if ($compareResult > 0)
|
||||
// - возвращаем 1
|
||||
return 1;
|
||||
else
|
||||
// - иначе если GUID равны, то возвращаем 0
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
#[Deprecated('Этот класс не имеет свойств. Данные методы не будут работать корректно. / This class has no properties. These methods will not work correctly.', '1.2')]
|
||||
public function CompareByProperty (string $propertyName, mixed $other): int
|
||||
{
|
||||
// Этот класс не имеет свойств, поэтому возвращаем 0
|
||||
return 0;
|
||||
}
|
||||
}
|
24
sources/traits/GUID/GUIDDuplicatedTrait.php
Normal file
24
sources/traits/GUID/GUIDDuplicatedTrait.php
Normal file
@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\traits\GUID;
|
||||
|
||||
use goodboyalex\php_components_pack\types\GUID;
|
||||
|
||||
/**
|
||||
* Часть кода класса GUID, отвечающая за реализацию интерфейса IDuplicated.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.2
|
||||
*/
|
||||
trait GUIDDuplicatedTrait
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function Duplicate (): object
|
||||
{
|
||||
return GUID::Parse($this->Value);
|
||||
}
|
||||
}
|
22
sources/traits/GUID/GUIDHashableTrait.php
Normal file
22
sources/traits/GUID/GUIDHashableTrait.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\traits\GUID;
|
||||
|
||||
/**
|
||||
* Часть кода класса GUID, отвечающая за реализацию интерфейса IHashable.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.2
|
||||
*/
|
||||
trait GUIDHashableTrait
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function Hash (): string
|
||||
{
|
||||
return md5($this->Value);
|
||||
}
|
||||
}
|
22
sources/traits/GUID/GUIDJsonSerializableTrait.php
Normal file
22
sources/traits/GUID/GUIDJsonSerializableTrait.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\traits\GUID;
|
||||
|
||||
/**
|
||||
* Часть кода класса GUID, отвечающая за реализацию интерфейса JsonSerializable.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.2
|
||||
*/
|
||||
trait GUIDJsonSerializableTrait
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function jsonSerialize (): string
|
||||
{
|
||||
return $this->Value;
|
||||
}
|
||||
}
|
41
sources/traits/GUID/GUIDSerializeTrait.php
Normal file
41
sources/traits/GUID/GUIDSerializeTrait.php
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\traits\GUID;
|
||||
|
||||
use goodboyalex\php_components_pack\exceptions\TypeException;
|
||||
|
||||
/**
|
||||
* Часть кода класса GUID, отвечающая за реализацию интерфейса ISerializable.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.2
|
||||
*/
|
||||
trait GUIDSerializeTrait
|
||||
{
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function Serialize (): string
|
||||
{
|
||||
// Получаем массив
|
||||
$array = $this->ToArray();
|
||||
|
||||
// Преобразуем в JSON
|
||||
return json_encode($array, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
* @throws TypeException Если тип не соответствует.
|
||||
*/
|
||||
public function UnSerialize (string $serialized): void
|
||||
{
|
||||
// Преобразуем в массив
|
||||
$array = json_decode($serialized, true, flags: JSON_UNESCAPED_UNICODE);
|
||||
|
||||
// Получаем значение
|
||||
$this->FromArray($array);
|
||||
}
|
||||
}
|
583
sources/types/GUID.md
Normal file
583
sources/types/GUID.md
Normal file
@ -0,0 +1,583 @@
|
||||
# Описание класса GUID
|
||||
|
||||
## Информация о версии
|
||||
|
||||
Версия класса: 1.0
|
||||
|
||||
Впервые введено в пакет с версии: 1.2
|
||||
|
||||
Описание класса: Класс GUID предназначен для работы с уникальными идентификаторами формата UUID/GUID.
|
||||
|
||||
## Реализуемые интерфейсы
|
||||
|
||||
Класс реализует следующие интерфейсы:
|
||||
|
||||
* `IArrayable`,
|
||||
* `IDuplicated`,
|
||||
* `ISerializable`,
|
||||
* `IComparable`,
|
||||
* `IHashable`,
|
||||
* `JsonSerializable`.
|
||||
|
||||
## Публичные свойства и константы класса
|
||||
|
||||
В классе определены следующие свойства и константы:
|
||||
|
||||
- `const GUID EMPTY` - константа для пустого GUID.
|
||||
|
||||
## Методы и функции
|
||||
|
||||
### Конструктор и деструктор.
|
||||
|
||||
Конструктор принимает **1 необязательный параметр**:
|
||||
|
||||
* `string $value` - строка GUID (по умолчанию, эквивалент `EMPTY`).
|
||||
|
||||
В результате создаётся новый класс `GUID`.
|
||||
|
||||
**Пример:**
|
||||
|
||||
// Контсуктор
|
||||
$guid = new GUID ('00000000-0000-0000-0000-000000000000');
|
||||
// Деструктор
|
||||
unset($guid);
|
||||
|
||||
Создаст и уничтожит класс `GUID`.
|
||||
|
||||
### Сохранение и загрузка из файла.
|
||||
|
||||
За сохранение и загрузку отвечают 2 метода: `SaveToFile` и `LoadFromFile`.
|
||||
|
||||
#### Сохранение в файл (метод `SaveToFile`)
|
||||
|
||||
Этот метод сохраняет содержимое JSON в файл. Он содержит **1 обязательный параметр**:
|
||||
|
||||
* `string $fileName` - имя файла на диске.
|
||||
|
||||
Метод возвращает `bool` - сохранены ли данные в файл: `true` - да, `false` - нет.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function SaveToFile (string $fileName): bool
|
||||
|
||||
**Пример:**
|
||||
|
||||
// Имя файла
|
||||
$fileName = __DIR__ . "/test.json";
|
||||
// Создаём класс
|
||||
$json = new JsonReWriter();
|
||||
// Заполним данными
|
||||
try {
|
||||
$json->Write("test/subtest/AAA", "123");
|
||||
$json->Write("test/subtest/BBB", 1.23);
|
||||
$json->Write("test1/test", 123);
|
||||
$json->Write("test2/test", true);
|
||||
$json->WriteArray("test3/test/res", [1, 2, 3]);
|
||||
} catch (JsonException $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
// Сохраняем созданный JSON файл
|
||||
$json->SaveToFile($fileName);
|
||||
|
||||
Содержимое файла `test.json` представлено далее:
|
||||
|
||||
{
|
||||
"test": {
|
||||
"subtest": {
|
||||
"AAA": "123",
|
||||
"BBB": 1.23
|
||||
}
|
||||
},
|
||||
"test1": {
|
||||
"test": 123
|
||||
},
|
||||
"test2": {
|
||||
"test": true
|
||||
},
|
||||
"test3": {
|
||||
"test": {
|
||||
"res": "[1,2,3]"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#### Загрузка файла (метод `LoadFromFile`)
|
||||
|
||||
Этот метод загружает содержимое файла в класс. Он содержит **1 обязательный параметр**:
|
||||
|
||||
* `string $fileName` - имя файла на диске.
|
||||
|
||||
Метод возвращает `bool` - загружены ли данные из файла: `true` - да, `false` - нет.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function LoadFromFile (string $fileName): bool
|
||||
|
||||
**Пример:**
|
||||
Пусть дан файл `test.json`, содержимое которого представлено далее:
|
||||
|
||||
{
|
||||
"test": {
|
||||
"subtest": {
|
||||
"AAA": "123",
|
||||
"BBB": 1.23
|
||||
}
|
||||
},
|
||||
"test1": {
|
||||
"test": 123
|
||||
},
|
||||
"test2": {
|
||||
"test": true
|
||||
},
|
||||
"test3": {
|
||||
"test": {
|
||||
"res": "[1,2,3]"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Следующий код загрузит это содержимое в класс:
|
||||
|
||||
// Имя файла
|
||||
$fileName = __DIR__ . "/test.json";
|
||||
// Создаём класс
|
||||
$json = new JsonReWriter();
|
||||
// Загружаю данные
|
||||
$json->LoadFromFile($fileName);
|
||||
|
||||
### Чтение данных
|
||||
|
||||
Для чтения данных используется один общий метод `Read` и 7 его производных метода: `ReadString`, `ReadInt`, `ReadFloat`,
|
||||
`ReadBool`, `ReadArray`, `ReadObject` и `ReadSerializable`.
|
||||
|
||||
#### Метод `Read`
|
||||
|
||||
Это метод, который читает значение ключа JSON. Он имеет **1 обязательный параметр** `string $key` (ключ) и **1
|
||||
необязательный параметр** `mixed $default` (значение по умолчанию, задан по умолчанию в `null`).
|
||||
|
||||
Этот метод возвращает `mixed`: значение ключа JSON или значение по умолчанию.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function Read (string $key, mixed $default = null): mixed
|
||||
|
||||
**Пример,**
|
||||
|
||||
// Создаю класс
|
||||
$json = new JsonReWriter();
|
||||
// Заполняю данными
|
||||
try {
|
||||
$json->Write("test/subtest/AAA", "123");
|
||||
$json->Write("test/subtest/BBB", 1.23);
|
||||
$json->Write("test1/test", 123);
|
||||
$json->Write("test2/test", true);
|
||||
$json->Write("test3/test/res", json_encode([1, 2, 3]));
|
||||
} catch (JsonException $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
|
||||
// Получаю значение
|
||||
$float = (float)$json->Read("test/subtest/BBB"));
|
||||
|
||||
В результате, переменная `$float` будет иметь значение `1.23`.
|
||||
|
||||
#### Метод `ReadString`
|
||||
|
||||
Это метод, который читает значение ключа JSON. Он имеет **1 обязательный параметр** `string $key` (ключ) и **1
|
||||
необязательный параметр** `string $default` (значение по умолчанию, задан по умолчанию в `""`).
|
||||
|
||||
Этот метод возвращает `string`: значение ключа JSON или значение по умолчанию.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function ReadString (string $key, string $default = ""): string
|
||||
|
||||
#### Метод `ReadInt`
|
||||
|
||||
Это метод, который читает значение ключа JSON. Он имеет **1 обязательный параметр** `string $key` (ключ) и **1
|
||||
необязательный параметр** `int $default` (значение по умолчанию, задан по умолчанию в `0`).
|
||||
|
||||
Этот метод возвращает `int`: значение ключа JSON или значение по умолчанию.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function ReadInt (string $key, int $default = 0): int
|
||||
|
||||
#### Метод `ReadFloat`
|
||||
|
||||
Это метод, который читает значение ключа JSON. Он имеет **1 обязательный параметр** `string $key` (ключ) и **1
|
||||
необязательный параметр** `float $default` (значение по умолчанию, задан по умолчанию в `0.0`).
|
||||
|
||||
Этот метод возвращает `float`: значение ключа JSON или значение по умолчанию.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function ReadFloat (string $key, float $default = 0.0): float
|
||||
|
||||
#### Метод `ReadBool`
|
||||
|
||||
Это метод, который читает значение ключа JSON. Он имеет **1 обязательный параметр** `string $key` (ключ) и **1
|
||||
необязательный параметр** `bool $default` (значение по умолчанию, задан по умолчанию в `false`).
|
||||
|
||||
Этот метод возвращает `bool`: значение ключа JSON или значение по умолчанию.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function ReadBool (string $key, bool $default = false): bool
|
||||
|
||||
#### Метод `ReadArray`
|
||||
|
||||
Это метод, который читает значение ключа JSON. Он имеет **1 обязательный параметр** `string $key` (ключ) и **1
|
||||
необязательный параметр** `array $default` (значение по умолчанию, задан по умолчанию в `[]`).
|
||||
|
||||
Этот метод возвращает `array`: значение ключа JSON или значение по умолчанию.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function ReadArray (string $key, array $default = []): array
|
||||
|
||||
#### Метод `ReadObject`
|
||||
|
||||
Это метод, который читает значение ключа JSON. Он имеет **2 обязательных параметра**:
|
||||
|
||||
- `string $key` (ключ);
|
||||
- `object $default` (значение по умолчанию).
|
||||
|
||||
Этот метод возвращает `object`: значение ключа JSON или значение по умолчанию.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function ReadObject (string $key, object $default): object
|
||||
|
||||
#### Метод `ReadSerializable`
|
||||
|
||||
Это метод, который читает значение ключа JSON. Он имеет **2 обязательных параметра**:
|
||||
|
||||
- `string $key` (ключ);
|
||||
- `string $serializableClassName` (имя класса, реализующего интерфейс ISerializable, с namespace).
|
||||
|
||||
Этот метод возвращает класс, реализующий интерфейс `ISerializable`.
|
||||
|
||||
**Важно!** Этот метод может выбросить исключение `JsonException`, если класс, заданный в `$serializableClassName` не
|
||||
реализует интерфейс `ISerializable`.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function ReadSerializable (string $key, string $serializableClassName): ISerializable
|
||||
|
||||
**Пример,**
|
||||
|
||||
Пусть для примера, класс `Demo` из namespace `iam\namespace` реализует интерфейс `ISerializable`.
|
||||
|
||||
// Создаю класс
|
||||
$json = new JsonReWriter();
|
||||
// ... Здесь где-то загрузка данных
|
||||
// Получаю класс
|
||||
try {
|
||||
/**
|
||||
* @var Demo $unSerializableClass
|
||||
*/
|
||||
$unSerializableClass = $json->ReadSerializable("test", "iam\\namespace\\Demo");
|
||||
} catch (JsonException $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
|
||||
В результате, переменная `$unSerializableClass` будет содержать данные класса `Demo`.
|
||||
|
||||
### Запись данных
|
||||
|
||||
Для чтения данных используется один общий метод `Write` и 3 его производных метода: `WriteArray`, `WriteObject` и
|
||||
`WriteSerializable`.
|
||||
|
||||
**Важно!** Лобой из вышеуказанных методов может выбросить исключение `JsonException`, если ключ не содержит вложений,
|
||||
хотя от него требуется обратное.
|
||||
|
||||
#### Метод `Write`
|
||||
|
||||
Это метод, который записывает значение в ключ JSON. Он имеет **2 обязательных параметра**:
|
||||
|
||||
- `string $key` (ключ);
|
||||
- `mixed $value` (записываемое значение).
|
||||
|
||||
Этот метод ничего не возвращает.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function Write (string $key, mixed $value): void
|
||||
|
||||
**Пример,**
|
||||
|
||||
// Имя файла
|
||||
$fileName = __DIR__ . "/test.json";
|
||||
// Создаём класс
|
||||
$json = new JsonReWriter();
|
||||
// Заполним данными
|
||||
try {
|
||||
$json->Write("test/subtest/AAA", "123");
|
||||
$json->Write("test/subtest/BBB", 1.23);
|
||||
$json->Write("test1/test", 123);
|
||||
$json->Write("test2/test", true);
|
||||
$json->WriteArray("test3/test/res", [1, 2, 3]);
|
||||
} catch (JsonException $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
// Сохраняем созданный JSON файл
|
||||
$json->SaveToFile($fileName);
|
||||
|
||||
Содержимое файла `test.json` представлено далее:
|
||||
|
||||
{
|
||||
"test": {
|
||||
"subtest": {
|
||||
"AAA": "123",
|
||||
"BBB": 1.23
|
||||
}
|
||||
},
|
||||
"test1": {
|
||||
"test": 123
|
||||
},
|
||||
"test2": {
|
||||
"test": true
|
||||
},
|
||||
"test3": {
|
||||
"test": {
|
||||
"res": "[1,2,3]"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#### Метод `WriteArray`
|
||||
|
||||
Это метод, который записывает значение в ключ JSON. Он имеет **2 обязательных параметра**:
|
||||
|
||||
- `string $key` (ключ);
|
||||
- `array $array` (записываемое значение).
|
||||
|
||||
Этот метод ничего не возвращает.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function WriteArray (string $key, array $array): void
|
||||
|
||||
#### Метод `WriteObject`
|
||||
|
||||
Это метод, который записывает значение в ключ JSON. Он имеет **2 обязательных параметра**:
|
||||
|
||||
- `string $key` (ключ);
|
||||
- `object $value` (записываемое значение).
|
||||
|
||||
Этот метод ничего не возвращает.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function WriteObject (string $key, object $value): void
|
||||
|
||||
#### Метод `WriteSerializable`
|
||||
|
||||
Это метод, который записывает значение в ключ JSON. Он имеет **2 обязательных параметра**:
|
||||
|
||||
- `string $key` (ключ);
|
||||
- `ISerializable $serializableValue` (записываемое значение).
|
||||
|
||||
Этот метод ничего не возвращает.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function WriteSerializable (string $key, ISerializable $serializableValue): void
|
||||
|
||||
**Пример,**
|
||||
Пусть для примера, класс `Demo` из namespace `iam\namespace` реализует интерфейс `ISerializable`.
|
||||
|
||||
// Имя файла
|
||||
$fileName = __DIR__ . "/test.json";
|
||||
// Создаём класс
|
||||
$json = new JsonReWriter();
|
||||
// Создаём класс Demo
|
||||
$serializableClass = new Demo(...);
|
||||
// Заполним данными
|
||||
try {
|
||||
$json->WriteSerializable("test", $serializableClass);
|
||||
} catch (JsonException $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
...
|
||||
|
||||
### Работа с ключами JSON
|
||||
|
||||
Для работы с ключами JSON есть 2 метода: `IsKeyExists` и `GetKeys`.
|
||||
|
||||
#### Метод `IsKeyExists`
|
||||
|
||||
Это метод проверяем наличие ключа в JSON. Он имеет **1 обязательный параметр** - `string $key` (ключ).
|
||||
|
||||
Этот метод возвращает `bool`: `true` если ключ найден и `false` в противном случае.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function IsKeyExists (string $key): bool
|
||||
|
||||
**Пример,**
|
||||
|
||||
// Создаём класс
|
||||
$json = new JsonReWriter();
|
||||
// Заполним данными
|
||||
try {
|
||||
$json->Write("test/subtest/AAA", "123");
|
||||
$json->Write("test/subtest/BBB", 1.23);
|
||||
$json->Write("test1/test", 123);
|
||||
$json->Write("test2/test", true);
|
||||
$json->WriteArray("test3/test/res", [1, 2, 3]);
|
||||
} catch (JsonException $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
// Проверяем ключи
|
||||
$check1 = $json->IsKeyExists("test/subtest/AAA");
|
||||
$check2 = $json->IsKeyExists("test/subtest/ССС");
|
||||
|
||||
В результате, `$check1` будет `true`, а `$check2` - `false`.
|
||||
|
||||
#### Метод `GetKeys`
|
||||
|
||||
Это метод получает список ключей. Он имеет **2 необязательных параметра**:
|
||||
|
||||
- `string $parentKey` (ключ родителя (или "" (установлено по умолчанию) для всех);
|
||||
- `bool $includeChildren` (нужно ли включать дочерние ключи (по умолчанию, да)).
|
||||
|
||||
Этот метод возвращает `array`: список ключей.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function GetKeys (string $parentKey = "", bool $includeChildren = true): array
|
||||
|
||||
**Пример,**
|
||||
|
||||
// Создаём класс
|
||||
$json = new JsonReWriter();
|
||||
// Заполним данными
|
||||
try {
|
||||
$json->Write("test/subtest/AAA", "123");
|
||||
$json->Write("test/subtest/BBB", 1.23);
|
||||
$json->Write("test1/test", 123);
|
||||
$json->Write("test2/test", true);
|
||||
$json->WriteArray("test3/test/res", [1, 2, 3]);
|
||||
} catch (JsonException $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
// Получаем ключи
|
||||
$keys1 = $json->GetKeys("test");
|
||||
$keys2 = $json->GetKeys("test", false);
|
||||
$keys3 = $json->GetKeys();
|
||||
|
||||
В результате, `$key1` будет следующим массивом:
|
||||
|
||||
[
|
||||
"test/subtest",
|
||||
"test/subtest/AAA",
|
||||
"test/subtest/BBB"
|
||||
]
|
||||
|
||||
`$key2` будет следующим массивом:
|
||||
|
||||
[
|
||||
"subtest"
|
||||
]
|
||||
|
||||
`$key3` будет следующим массивом:
|
||||
|
||||
[
|
||||
"test",
|
||||
"test/subtest",
|
||||
"test/subtest/AAA",
|
||||
"test/subtest/BBB",
|
||||
"test1",
|
||||
"test1/test",
|
||||
"test2",
|
||||
"test2/test",
|
||||
"test3",
|
||||
"test3/test",
|
||||
"test3/test/res"
|
||||
]
|
||||
|
||||
### Удаление ключей JSON
|
||||
|
||||
Для удаления ключей JSON есть 2 метода: `DeleteKey`, который удаляет только определённый ключ и `Clear`, который удаляет
|
||||
**все ключи** из json-файла.
|
||||
|
||||
#### Метод `DeleteKey`
|
||||
|
||||
Это метод удаляет только определённый ключ в JSON. Он имеет **1 обязательный параметр** - `string $key` (ключ).
|
||||
|
||||
Этот метод возвращает `bool` - результат удаления ключа: `true` - удаление прошло успешно, `false` - произошла ошибка
|
||||
при удалении.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function DeleteKey (string $key): bool
|
||||
|
||||
**Пример,**
|
||||
|
||||
// Создаём класс
|
||||
$json = new JsonReWriter();
|
||||
// Заполним данными
|
||||
try {
|
||||
$json->Write("test/subtest/AAA", "123");
|
||||
$json->Write("test/subtest/BBB", 1.23);
|
||||
$json->Write("test1/test", 123);
|
||||
$json->Write("test2/test", true);
|
||||
$json->WriteArray("test3/test/res", [1, 2, 3]);
|
||||
} catch (JsonException $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
// Получаемем ключи до удаления
|
||||
$check1 = $json->GetKeys("test/subtest");
|
||||
// Удаляем ключ
|
||||
$this->DeleteKey("test/subtest/BBB");
|
||||
// Получаемем ключи после удаления
|
||||
$check2 = $json->GetKeys("test/subtest");
|
||||
|
||||
В результате, `$check1` будет
|
||||
|
||||
[
|
||||
"test/subtest",
|
||||
"test/subtest/AAA",
|
||||
"test/subtest/BBB"
|
||||
]
|
||||
|
||||
а `$check2`:
|
||||
|
||||
[
|
||||
"test/subtest",
|
||||
"test/subtest/AAA"
|
||||
]
|
||||
|
||||
#### Метод `Clear`
|
||||
|
||||
Это метод удаляет **все ключи** из json-файла. Он не имеет никаких параметров и ничего не возвращает.
|
||||
|
||||
Синтаксис:
|
||||
|
||||
public function Clear (): void
|
||||
|
||||
**Пример,**
|
||||
|
||||
// Создаём класс
|
||||
$json = new JsonReWriter();
|
||||
// Заполним данными
|
||||
try {
|
||||
$json->Write("test/subtest/AAA", "123");
|
||||
$json->Write("test/subtest/BBB", 1.23);
|
||||
$json->Write("test1/test", 123);
|
||||
$json->Write("test2/test", true);
|
||||
$json->WriteArray("test3/test/res", [1, 2, 3]);
|
||||
} catch (JsonException $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
// Очищаем
|
||||
$json->Clear();
|
||||
// Получаем ключи
|
||||
$keys = $json->GetKeys();
|
||||
|
||||
В результате, `$key` будет следующим массивом:
|
||||
|
||||
[
|
||||
]
|
270
sources/types/GUID.php
Normal file
270
sources/types/GUID.php
Normal file
@ -0,0 +1,270 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\types;
|
||||
|
||||
use goodboyalex\php_components_pack\extensions\StringExtension;
|
||||
use goodboyalex\php_components_pack\interfaces\IArrayable;
|
||||
use goodboyalex\php_components_pack\interfaces\IComparable;
|
||||
use goodboyalex\php_components_pack\interfaces\IDuplicated;
|
||||
use goodboyalex\php_components_pack\interfaces\IHashable;
|
||||
use goodboyalex\php_components_pack\interfaces\ISerializable;
|
||||
use goodboyalex\php_components_pack\traits\GUID\GUIDArrayableTrait;
|
||||
use goodboyalex\php_components_pack\traits\GUID\GUIDComparableTrait;
|
||||
use goodboyalex\php_components_pack\traits\GUID\GUIDDuplicatedTrait;
|
||||
use goodboyalex\php_components_pack\traits\GUID\GUIDHashableTrait;
|
||||
use goodboyalex\php_components_pack\traits\GUID\GUIDJsonSerializableTrait;
|
||||
use goodboyalex\php_components_pack\traits\GUID\GUIDSerializeTrait;
|
||||
use InvalidArgumentException;
|
||||
use JsonSerializable;
|
||||
use LengthException;
|
||||
use OutOfRangeException;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* Определение константы для пустого GUID как строки.
|
||||
*/
|
||||
if (!defined('GUID_EMPTY_STRING'))
|
||||
define('GUID_EMPTY_STRING', '00000000-0000-0000-0000-000000000000');
|
||||
|
||||
/**
|
||||
* Определение константы для пустого GUID.
|
||||
*/
|
||||
if (!defined('GUID_EMPTY'))
|
||||
define('GUID_EMPTY', new GUID(GUID_EMPTY_STRING));
|
||||
|
||||
/**
|
||||
* Класс GUID предназначен для работы с уникальными идентификаторами формата UUID/GUID.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.2
|
||||
*/
|
||||
final class GUID implements IArrayable, IDuplicated, ISerializable, IComparable, IHashable, JsonSerializable
|
||||
{
|
||||
/**
|
||||
* Константа для пустого GUID.
|
||||
*/
|
||||
public const GUID EMPTY = GUID_EMPTY;
|
||||
|
||||
/**
|
||||
* @var string $Value Внутреннее свойство для хранения значения GUID.
|
||||
*/
|
||||
private string $Value {
|
||||
get => StringExtension::IsNullOrWhitespace($this->Value) ? GUID_EMPTY_STRING : $this->Value;
|
||||
set {
|
||||
if (!self::Validate($value))
|
||||
throw new InvalidArgumentException('Неверный идентификатор (GUID) / Wrong GUID identifier.');
|
||||
|
||||
$this->Value = $value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Конструктор GUID-класса.
|
||||
*
|
||||
* @param string $value Значение GUID. По умолчанию, пустой GUID.
|
||||
*
|
||||
* @see GUID_EMPTY_STRING
|
||||
*/
|
||||
public function __construct (string $value = GUID_EMPTY_STRING)
|
||||
{
|
||||
$this->Value = $value;
|
||||
}
|
||||
|
||||
// Подключаем трейт реализующий интерфейс ISerializable
|
||||
use GUIDSerializeTrait;
|
||||
|
||||
// Подключаем трейт реализующий интерфейс IArrayable
|
||||
use GUIDArrayableTrait;
|
||||
|
||||
// Подключаем трейт реализующий интерфейс IDuplicated
|
||||
use GUIDDuplicatedTrait;
|
||||
|
||||
// Подключаем трейт реализующий интерфейс JsonSerializable
|
||||
use GUIDJsonSerializableTrait;
|
||||
|
||||
// Подключаем трейт реализующий интерфейс IHashable
|
||||
use GUIDHashableTrait;
|
||||
|
||||
// Подключаем трейт реализующий интерфейс IComparable
|
||||
use GUIDComparableTrait;
|
||||
|
||||
/**
|
||||
* Генерация нового случайного GUID.
|
||||
*
|
||||
* @return GUID Новый уникальный GUID.
|
||||
*/
|
||||
public static function Generate (): GUID
|
||||
{
|
||||
try {
|
||||
// Генерация случайных значений для GUID
|
||||
$randomParts = [
|
||||
// - 32-разрядная часть поля time_low
|
||||
random_int(0, 0xffff),
|
||||
// - продолжение time_low
|
||||
random_int(0, 0xffff),
|
||||
// - 16-разрядная часть поля time_mid
|
||||
random_int(0, 0xffff),
|
||||
// - версии бит в time_hi_and_version
|
||||
random_int(0, 0x0fff) | 0x4000,
|
||||
// - различные биты в clk_seq_hi_res и clk_seq_low
|
||||
random_int(0, 0x3fff) | 0x8000,
|
||||
// - первые 16 бит node_id
|
||||
random_int(0, 0xffff),
|
||||
// - продолжение node_id (вторые 16 бит)
|
||||
random_int(0, 0xffff),
|
||||
// - последние 16 бит node_id
|
||||
random_int(0, 0xffff)
|
||||
];
|
||||
|
||||
// Формирование GUID из случайных значений
|
||||
$guid = vsprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', $randomParts);
|
||||
}
|
||||
catch (Throwable) {
|
||||
// Если возникла ошибка при генерации GUID, возвращаем пустой GUID
|
||||
$guid = GUID_EMPTY_STRING;
|
||||
}
|
||||
|
||||
// Создание экземпляра GUID со сгенерированным значением и возврат его
|
||||
return new self($guid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет, является ли GUID пустым или недействительным.
|
||||
*
|
||||
* @param GUID|null $guid Экземпляр GUID или null.
|
||||
*
|
||||
* @return bool True, если GUID недействителен или равен пустому значению.
|
||||
*/
|
||||
public static function isInvalidOrEmpty (?GUID $guid): bool
|
||||
{
|
||||
return !self::Validate($guid) || $guid === self::EMPTY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Валидирует строку GUID.
|
||||
*
|
||||
* @param mixed $guid Объект GUID или строка для проверки.
|
||||
*
|
||||
* @return bool Результат проверки.
|
||||
*/
|
||||
public static function Validate (mixed $guid): bool
|
||||
{
|
||||
// Проверка на пустое значение
|
||||
if (empty($guid))
|
||||
// - если пустое, то возвращаем false
|
||||
return false;
|
||||
|
||||
// Проверка на тип GUID
|
||||
if ($guid instanceof GUID)
|
||||
// - если GUID, то переводим его в строку
|
||||
$guid = $guid->Value;
|
||||
|
||||
// Проверка на соответствие формату GUID
|
||||
return preg_match('/^[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}$/', $guid) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Создает экземпляр GUID из массива байтов.
|
||||
*
|
||||
* @param array $bytes Массив байтов GUID.
|
||||
*
|
||||
* @return GUID Класс GUID
|
||||
*/
|
||||
public static function FromBytes (array $bytes): GUID
|
||||
{
|
||||
// Проверка на корректность массива байтов
|
||||
if (count($bytes) != 16)
|
||||
// - если массив байтов не содержит 16 байтов, выбрасываем исключение
|
||||
throw new LengthException('Массив байтов должен содержать 16 байтов / Bytes array must contain 16 bytes.');
|
||||
|
||||
// Преобразование массива байтов в строку
|
||||
$hex = bin2hex(pack('C*', ...$bytes));
|
||||
|
||||
// Создание GUID из преобразованной строки
|
||||
$guid =
|
||||
new GUID(substr($hex, 0, 8) . '-' . substr($hex, 8, 4) . '-' . substr($hex, 12, 4) . '-' . substr($hex, 16,
|
||||
4) . '-' . substr($hex, 20, 12));
|
||||
|
||||
// Возврат экземпляра GUID
|
||||
return new GUID($guid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Создает экземпляр GUID из строки GUID.
|
||||
*
|
||||
* @param string $guidString Строка GUID.
|
||||
*
|
||||
* @return GUID Класс GUID.
|
||||
*/
|
||||
public static function Parse (string $guidString): GUID
|
||||
{
|
||||
return
|
||||
// Проверка на валидность переданного GUID
|
||||
!self::Validate($guidString)
|
||||
// - если GUID недействителен, выбрасываем исключение
|
||||
? throw new InvalidArgumentException('Предан неверный GUID / Wrong GUID.')
|
||||
// - иначе, создаем экземпляр GUID из строки
|
||||
: new GUID($guidString);
|
||||
}
|
||||
|
||||
/**
|
||||
* Преобразует объект GUID в строку.
|
||||
*
|
||||
* @return string Строковое представление GUID.
|
||||
*/
|
||||
public function __toString (): string
|
||||
{
|
||||
return $this->Value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает сегмент GUID по его номеру.
|
||||
*
|
||||
* @param int $segmentNumber Номер сегмента: 1 - time_low, 2 - time_mid, 3 - time_hi_and_version, 4 -
|
||||
* clk_seq_hi_res и clk_seq_low, 5 - node_id. В случае, если номер сегмента некорректен, выбрасывается
|
||||
* исключение <code>OutOfRangeException</code>.
|
||||
*
|
||||
* @return string Сегмент GUID.
|
||||
* @throws OutOfRangeException Если номер сегмента некорректен.
|
||||
*/
|
||||
public function Segment (int $segmentNumber): string
|
||||
{
|
||||
// Проверка на корректность номера сегмента
|
||||
if ($segmentNumber < 1 || $segmentNumber > 5)
|
||||
// - если номер сегмента некорректен, выбрасываем исключение
|
||||
throw new OutOfRangeException('Номер сегмента должен быть между 1 и 5 / Segment number must be between 1 and 5.');
|
||||
|
||||
// Разделение GUID на сегменты по дефисам
|
||||
$segments = explode('-', $this->Value);
|
||||
|
||||
// Возврат нужного сегмента
|
||||
return $segments[$segmentNumber - 1];
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает массив байтов GUID.
|
||||
*
|
||||
* @return array Массив байтов GUID.
|
||||
*/
|
||||
public function ToBytes (): array
|
||||
{
|
||||
// Разделение GUID на части
|
||||
[$data1, $data2, $data3, $data4_1, $data4_2, $data5] =
|
||||
sscanf($this->Value, "%08s-%04s-%04s-%04s-%04s%012s");
|
||||
|
||||
// Преобразование в массив байтов
|
||||
return unpack('C*', hex2bin($data1 . $data2 . $data3 . $data4_1 . $data4_2 . $data5));
|
||||
}
|
||||
|
||||
/**
|
||||
* Возвращает строковое представление GUID.
|
||||
*
|
||||
* @return string Строковое представление GUID.
|
||||
*/
|
||||
public function ToString (): string
|
||||
{
|
||||
return $this->Value;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user