20250709 1.1.1 Beta 2
This commit is contained in:
		
							
								
								
									
										168
									
								
								sources/extensions/TypeExtension.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								sources/extensions/TypeExtension.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,168 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | namespace goodboyalex\php_components_pack\extensions; | ||||||
|  |  | ||||||
|  | use DateMalformedStringException; | ||||||
|  | use DateTime; | ||||||
|  | use DateTimeImmutable; | ||||||
|  | use DateTimeInterface; | ||||||
|  | use Exception; | ||||||
|  | use UnitEnum; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Расширение для любого типа. | ||||||
|  |  * | ||||||
|  |  * @author Александр Бабаев | ||||||
|  |  * @package php_components_pack | ||||||
|  |  * @version 1.0 | ||||||
|  |  * @since 1.1.1 | ||||||
|  |  */ | ||||||
|  | final class TypeExtension | ||||||
|  | { | ||||||
|  |     /** | ||||||
|  |      * Переводит объект в массив. | ||||||
|  |      * | ||||||
|  |      * @return array Массив свойств типа. | ||||||
|  |      */ | ||||||
|  |     public function ToArray (object $class): array | ||||||
|  |     { | ||||||
|  |         // Создаю массив результата | ||||||
|  |         $result = []; | ||||||
|  |  | ||||||
|  |         // Получаю свойства класса | ||||||
|  |         $properties = get_object_vars($class); | ||||||
|  |  | ||||||
|  |         // Для каждого свойства класса | ||||||
|  |         foreach ($properties as $key => $value) { | ||||||
|  |             // - если значение является датой | ||||||
|  |             if ($value instanceof DateTimeInterface) { | ||||||
|  |  | ||||||
|  |                 // -- добавляю в массив | ||||||
|  |                 $result[$key] = $value->getTimestamp(); | ||||||
|  |  | ||||||
|  |                 // -- следующий элемент | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // - если значение является перечислением | ||||||
|  |             if ($value instanceof UnitEnum) { | ||||||
|  |                 // -- получаю перечисление | ||||||
|  |                 $result[$key] = $value->name; | ||||||
|  |  | ||||||
|  |                 // -- следующий элемент | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // - если значение является NULL | ||||||
|  |             if (is_null($value)) { | ||||||
|  |                 // -- присваиваю NULL | ||||||
|  |                 $result[$key] = "null"; | ||||||
|  |                 // -- следующий элемент | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // - присваиваю значение | ||||||
|  |             $result[$key] = $value; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Возвращаю результат | ||||||
|  |         return $result; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Переводит массив в объект. | ||||||
|  |      * | ||||||
|  |      * @param array $array Массив свойств. | ||||||
|  |      * @param string $className Требуемый класс (внимание: с namespace!). | ||||||
|  |      * | ||||||
|  |      * @return mixed Объект типа $className. | ||||||
|  |      * @throws Exception Исключение, если объект не создан, или дата не корректного формата или пытается передать null | ||||||
|  |      *     не nullable типу. | ||||||
|  |      */ | ||||||
|  |     public function FromArray (array $array, string $className): object | ||||||
|  |     { | ||||||
|  |         // Создаем объект | ||||||
|  |         $instance = new $className(); | ||||||
|  |  | ||||||
|  |         // Проверяем, что объект создан | ||||||
|  |         if (!is_object($instance) && $instance instanceof $className) | ||||||
|  |             // - если нет, то выбрасываю исключение | ||||||
|  |             throw new Exception("Object is not created / Объект не создан."); | ||||||
|  |  | ||||||
|  |         // Получаю свойства класса | ||||||
|  |         $properties = get_object_vars($instance); | ||||||
|  |  | ||||||
|  |         // Для каждого свойства класса | ||||||
|  |         foreach ($properties as $key => $value) { | ||||||
|  |             // - проверяю, есть ли свойство в массиве | ||||||
|  |             if (!array_key_exists($key, $array)) | ||||||
|  |                 // -- если нет, то пропускаю | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|  |             // - получаю значение из массива | ||||||
|  |             $value = $array[$key]; | ||||||
|  |  | ||||||
|  |             // - если значение является датой DateTime | ||||||
|  |             if ($instance->$key instanceof DateTime && is_int($value)) { | ||||||
|  |                 // -- присваиваю значение | ||||||
|  |                 try { | ||||||
|  |                     $instance->$key = new DateTime ('@' . $value); | ||||||
|  |                 } | ||||||
|  |                 catch (DateMalformedStringException) { | ||||||
|  |                     throw new Exception("Date is not correct format / Дата не корректного формата."); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // -- следующий элемент | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // - если значение является датой DateTimeImmutable | ||||||
|  |             if ($instance->$key instanceof DateTimeImmutable && is_int($value)) { | ||||||
|  |                 // -- присваиваю значение | ||||||
|  |                 try { | ||||||
|  |                     $instance->$key = new DateTimeImmutable('@' . $value); | ||||||
|  |                 } | ||||||
|  |                 catch (DateMalformedStringException) { | ||||||
|  |                     // -- создаю дату с нулевым временем, если ошибка | ||||||
|  |                     $instance->$key = new DateTimeImmutable(); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // -- следующий элемент | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // - если значение является перечислением | ||||||
|  |             if ($instance->$key instanceof UnitEnum) { | ||||||
|  |                 // -- получаю все значения перечисления | ||||||
|  |                 foreach ($instance->$key::getCases() as $case) | ||||||
|  |                     // --- если значение совпадает | ||||||
|  |                     if ($case->name === $value) | ||||||
|  |                         // ---- присваиваю значение | ||||||
|  |                         $instance->$key = $case; | ||||||
|  |  | ||||||
|  |                 // -- следующий элемент | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // - если значение является NULL | ||||||
|  |             if ($value = "null") { | ||||||
|  |                 // -- присваиваю NULL | ||||||
|  |                 try { | ||||||
|  |                     $instance->$key = null; | ||||||
|  |                 } | ||||||
|  |                 catch (Exception $exception) { | ||||||
|  |                     throw new Exception("Cannot assign null to non-nullable property. / Невозможно присвоить null не nullable типу: {$exception->getMessage()}."); | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // -- следующий элемент | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // - присваиваю значение | ||||||
|  |             $instance->$key = $value; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Возвращаю объект | ||||||
|  |         return $instance; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,710 +0,0 @@ | |||||||
| # Описание класса JsonReWriter |  | ||||||
|  |  | ||||||
| ## Информация о версии |  | ||||||
|  |  | ||||||
| Версия класса: 1.0 |  | ||||||
|  |  | ||||||
| Впервые введено в пакет с версии: 1.1.0 |  | ||||||
|  |  | ||||||
| Описание класса: Класс для работы с JSON-файлами. |  | ||||||
|  |  | ||||||
| ## Публичные свойства и константы класса |  | ||||||
|  |  | ||||||
| В классе определены следующие свойства: |  | ||||||
|  |  | ||||||
| - `string $JsonString` - строка JSON (чтение/запись). |  | ||||||
|  |  | ||||||
| ## Быстрый старт |  | ||||||
|  |  | ||||||
| ### Правила формирования ключей. |  | ||||||
|  |  | ||||||
| Ключ для чтения/записи данных класса формируется следующим образом: `ключ/подключ/подключ подключа` . |  | ||||||
|  |  | ||||||
| Например, если дан json-файл: |  | ||||||
|  |  | ||||||
|     { |  | ||||||
| 	    "test": { |  | ||||||
| 	        "subtest": { |  | ||||||
| 	            "AAA": "123", |  | ||||||
| 	            "BBB": 1.23 |  | ||||||
| 	        } |  | ||||||
| 	    }, |  | ||||||
| 	    "test1": { |  | ||||||
| 	        "test": 123 |  | ||||||
| 	    }, |  | ||||||
| 	    "test2": { |  | ||||||
| 	        "test": true |  | ||||||
| 	    }, |  | ||||||
| 	    "test3": { |  | ||||||
| 	        "test": { |  | ||||||
| 	            "res": "[1,2,3]" |  | ||||||
| 	        } |  | ||||||
| 	    } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| Пусть требуется получить значение `BBB`, тогда ключ должен быть `test/subtest/BBB`. |  | ||||||
|  |  | ||||||
| ### Чтение. |  | ||||||
|  |  | ||||||
| 1. Создайте элемент класса `$json = new JsonReWriter ();` |  | ||||||
| 2. Если у вас требуется загрузить json из файла `$fileName`, то воспользуйтесь методом `LoadFromFile`: |  | ||||||
|    `$json->LoadFromFile($fileName);`, если же json представлен строкой `$jsonStr`, то загрузите её в свойство |  | ||||||
|    `$JsonString`: `$json->JsonString = $jsonStr;` |  | ||||||
| 3. Далее можно пользоваться любым методом для чтения `Read*`, в том числе и общим `$json->Read(...)`. |  | ||||||
|  |  | ||||||
| **Пример:** |  | ||||||
|  |  | ||||||
| 	// Имя файла |  | ||||||
|     $fileName = __DIR__ . "/test.json"; |  | ||||||
|     // Создаю класс |  | ||||||
| 	$json = new JsonReWriter(); |  | ||||||
| 	// Загшружаю данные из файла |  | ||||||
| 	$json->LoadFromFile($fileName); |  | ||||||
| 	// Получаю число |  | ||||||
| 	$float = $json->ReadFloat("test/subtest/BBB", 0.2); |  | ||||||
|  |  | ||||||
| В итоге в `$float` будет `1.23`. |  | ||||||
|  |  | ||||||
| ### Запись. |  | ||||||
|  |  | ||||||
| 1. Создайте элемент класса `$json = new JsonReWriter ();` |  | ||||||
| 2. Далее можно пользоваться любым методом для записи `Write*`, в том числе и общим `$json->Write(...)`. |  | ||||||
| 3. Если вам требуется создать json файл с именем `$fileName`, то воспользуйтесь методом `SaveToFile`: |  | ||||||
|    `$json->SaveToFile($fileName);`, если же json должен быть представлен строкой `$jsonStr`, то загрузите её из свойства |  | ||||||
|    `$JsonString`: `$jsonStr = $json->JsonString;` |  | ||||||
|  |  | ||||||
| **Пример:** |  | ||||||
|  |  | ||||||
| 	// Имя файла |  | ||||||
|     $fileName = __DIR__ . "/test.json"; |  | ||||||
|     // Создаю класс |  | ||||||
| 	$json = new JsonReWriter(); |  | ||||||
| 	// Загшружаю данные из файла |  | ||||||
| 	$json->LoadFromFile($fileName); |  | ||||||
| 	// Получаю число |  | ||||||
| 	try { |  | ||||||
| 		$json->Write("test/subtest/BBB", 0.2); |  | ||||||
| 	} |  | ||||||
| 	catch (JsonException $e) { |  | ||||||
| 		echo $e->getMessage(); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| В итоге в `test/subtest/BBB` вместо `1.23` будет `0.2`. |  | ||||||
|  |  | ||||||
| ## Коды ошибок JsonErrorCode |  | ||||||
|  |  | ||||||
| Ниже представлена таблица основных кодов ошибки: |  | ||||||
|  |  | ||||||
| |       Ошибка        |                                  Описание                                   | Введено с версии |   |  | ||||||
| |:-------------------:|:---------------------------------------------------------------------------:|:----------------:|   |  | ||||||
| |       Unknown       |                             Неизвестная ошибка                              |       1.0        |   |  | ||||||
| |        None         |                                 Ошибок нет                                  |       1.0        |   |  | ||||||
| |        Depth        |                    Достигнута максимальная глубина стека                    |       1.0        |   |  | ||||||
| |    StateMismatch    |                       Неверный или некорректный JSON                        |       1.0        |   |  | ||||||
| |      CTRLChar       |          Ошибка управляющего символа, возможно, неверная кодировка          |       1.0        |   |  | ||||||
| |       Syntax        |                            Синтаксическая ошибка                            |       1.0        |   |  | ||||||
| |        UTF8         |   Некорректные для кодировки UTF-8 символы, возможно, неверная кодировка    |       1.0        |   |  | ||||||
| |      Recursion      |         Одна или несколько зацикленных ссылок в кодируемом значении         |       1.0        |   |  | ||||||
| |      InfOrNan       |        Одно или несколько значений NAN или INF в кодируемом значении        |       1.0        |   |  | ||||||
| |   UnsupportedType   |                 Передали значение с неподдерживаемым типом                  |       1.0        |   |  | ||||||
| | InvalidPropertyName |                   Имя свойства не может быть закодировано                   |       1.0        |   |  | ||||||
| |        UTF16        | Некорректный для кодировки UTF-16 символ, возможно, некорректно закодирован |       1.0        |   |  | ||||||
| |    KeyIsNotArray    |         Ключ не содержит вложений, хотя от него требуется обратное          |       1.0        |   |  | ||||||
| |  NotISerializable   |                 Класс не реализует интерфейс ISerializable                  |       1.0        | |  | ||||||
|  |  | ||||||
| ### Методы и функции перечисления JsonErrorCode |  | ||||||
|  |  | ||||||
| Перечисление содержит **статический метод** `static function FromLastError (): JsonErrorCode`, который получает код |  | ||||||
| ошибки из последней JSON ошибки. |  | ||||||
|  |  | ||||||
| Например, при успешной загрузке, можем проверить ошибки: |  | ||||||
|  |  | ||||||
|     $errors = JsonErrorCode::FromLastError (); |  | ||||||
|  |  | ||||||
| После того, как мы выведем `$errors`, мы получим `JsonErrorCode::None`. |  | ||||||
|  |  | ||||||
| ## Исключение JsonException |  | ||||||
|  |  | ||||||
| Исключение расширяет класс `Exception`, поэтому может выбрасываться через `throw`. |  | ||||||
|  |  | ||||||
| ### Свойства |  | ||||||
|  |  | ||||||
| Исключение содержит следующие свойства: |  | ||||||
|  |  | ||||||
| - `?string $JsonString` - строка JSON (или null); |  | ||||||
| - `JsonErrorCode $ErrorCode` - код ошибки JSON; |  | ||||||
| - `?string $ErrorMessage` - сообщение об ошибке JSON (в отличие от функции json_last_error_msg(), данная переменная при |  | ||||||
|   отсутствии ошибок выводит null, а не "No error"). |  | ||||||
|  |  | ||||||
| ### Методы и функции |  | ||||||
|  |  | ||||||
| #### Конструктор. |  | ||||||
|  |  | ||||||
| Конструктор принимает **3 необязательных параметра**: |  | ||||||
|  |  | ||||||
| * `?string $json` - строка JSON (по умолчанию, `null`); |  | ||||||
| * `JsonErrorCode $errorCode` - код ошибки (по умолчанию, `JsonErrorCode::Unknown`); |  | ||||||
| * `?string $errorMessage` - сообщение об ошибке (по умолчанию, `null`). |  | ||||||
|  |  | ||||||
| В результате создаётся новое исключение `JsonException`. |  | ||||||
|  |  | ||||||
| Пример: |  | ||||||
|  |  | ||||||
|     throw new JsonException("{}", JsonErrorCode::Depth, "Пример"); |  | ||||||
|  |  | ||||||
| Создаст исключение `JsonException`. |  | ||||||
|  |  | ||||||
| ## Методы и функции |  | ||||||
|  |  | ||||||
| ### Конструктор и деструктор. |  | ||||||
|  |  | ||||||
| Конструктор не принимает никаких параметров. |  | ||||||
|  |  | ||||||
| В результате создаётся новый класс `JsonReWriter`. |  | ||||||
|  |  | ||||||
| **Пример:** |  | ||||||
|  |  | ||||||
|     // Контсуктор |  | ||||||
|     $json = new JsonReWriter (); |  | ||||||
|     // Деструктор |  | ||||||
|     unset($json); |  | ||||||
|  |  | ||||||
| Создаст и уничтожит класс `JsonReWriter`. |  | ||||||
|  |  | ||||||
| ### Сохранение и загрузка из файла. |  | ||||||
|  |  | ||||||
| За сохранение и загрузку отвечают 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` будет следующим массивом: |  | ||||||
|  |  | ||||||
|     [ |  | ||||||
|     ] |  | ||||||
| @@ -1,46 +0,0 @@ | |||||||
| <?php |  | ||||||
|  |  | ||||||
| namespace goodboyalex\php_components_pack\operators; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Полезные операторы. |  | ||||||
|  * |  | ||||||
|  * @author Александр Бабаев |  | ||||||
|  * @package php_components_pack |  | ||||||
|  * @version 1.0 |  | ||||||
|  * @since 1.1.1 |  | ||||||
|  */ |  | ||||||
| final class Operators |  | ||||||
| { |  | ||||||
|     /** |  | ||||||
|      * Проверяет, что значение <code>$value</code> равно одному из значений <code>$values</code>. |  | ||||||
|      * |  | ||||||
|      * @param mixed $value Искомое значение. |  | ||||||
|      * @param mixed ...$values Массив значений. |  | ||||||
|      * |  | ||||||
|      * @return bool Возвращает <code>true</code>, если значение <code>$value</code> равно одному из значений |  | ||||||
|      *     <code>$values</code>, иначе <code>false</code>. |  | ||||||
|      */ |  | ||||||
|     public static function Is (mixed $value, mixed ...$values): bool |  | ||||||
|     { |  | ||||||
|         // Проверяем, что хотя бы одно из значений равно искомому и возвращаем результат |  | ||||||
|         return array_any($values, fn ($curValue) => $curValue === $value); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Проверяет, сколько раз значение <code>$value</code> встречается в массиве <code>$values</code>. |  | ||||||
|      * |  | ||||||
|      * @param mixed $value Искомое значение. |  | ||||||
|      * @param mixed ...$values Массив значений. |  | ||||||
|      * |  | ||||||
|      * @return int Возвращает количество значений <code>$values</code>, которые равны <code>$value</code>. |  | ||||||
|      */ |  | ||||||
|     public static function IsCount (mixed $value, mixed ...$values): int |  | ||||||
|     { |  | ||||||
|         // Получаем массив значений повторений |  | ||||||
|         $result = array_count_values($values); |  | ||||||
|  |  | ||||||
|         // Возвращаем результат |  | ||||||
|         return $result[$value] ?? 0; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,119 +0,0 @@ | |||||||
| <?php |  | ||||||
|  |  | ||||||
| namespace goodboyalex\php_components_pack\types; |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Тип-расширение для типа bool. |  | ||||||
|  * |  | ||||||
|  * @author Александр Бабаев |  | ||||||
|  * @package php_components_pack |  | ||||||
|  * @version 1.0 |  | ||||||
|  * @since 1.1.1 |  | ||||||
|  */ |  | ||||||
| final class BoolEx |  | ||||||
| { |  | ||||||
|     /** |  | ||||||
|      * @var int $False Значение "ложь". |  | ||||||
|      */ |  | ||||||
|     public const int False = -1; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * @var int $Null Значение не установлено (и не истина, и не ложь). |  | ||||||
|      */ |  | ||||||
|     public const int Null = 0; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * @var int $True Значение "истина". |  | ||||||
|      */ |  | ||||||
|     public const int True = 1; |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * @var int $Value Хранимое значение. |  | ||||||
|      */ |  | ||||||
|     private int $Value; |  | ||||||
|  |  | ||||||
|     public function __construct (?bool $value = null) |  | ||||||
|     { |  | ||||||
|         // Присваиваем значение |  | ||||||
|         $this->Value = $value === null ? self::Null : ($value ? self::True : self::False); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Преобразует значение в экземпляр типа. |  | ||||||
|      * |  | ||||||
|      * ВАЖНО: при преобразовании в тип будет использована следующая логика: |  | ||||||
|      * |  | ||||||
|      * - <code>'true'</code>, <code>'1'</code>, <code>'on'</code>, <code>'yes'</code>, <code>'y'</code>, |  | ||||||
|      * <code>'t'</code>, <code>true</code>, <code>1</code>, <code>1.0</code> считаются как истина; |  | ||||||
|      * - <code>'false'</code>, <code>'0'</code>, <code>'off'</code>, <code>'no'</code>, <code>'n'</code>, |  | ||||||
|      * <code>'f'</code>, <code>false</code>, <code>-1</code>, <code>-1.0</code> считаются как ложь; |  | ||||||
|      * - все остальные значения считаются как неустановленною (и не истина, и не ложь). |  | ||||||
|      * |  | ||||||
|      * @param mixed $value Значение. |  | ||||||
|      * |  | ||||||
|      * @return BoolEx Возвращает экземпляр типа. |  | ||||||
|      */ |  | ||||||
|     public static function Parse (mixed $value): BoolEx |  | ||||||
|     { |  | ||||||
|         // Преобразуем значение в тип |  | ||||||
|         $value = match ($value) { |  | ||||||
|             'true', '1', 'on', 'yes', 'y', 't', true, 1, 1.0 => self::True, |  | ||||||
|             'false', '0', 'off', 'no', 'n', 'f', false, -1, -1.0 => self::False, |  | ||||||
|             default => self::Null |  | ||||||
|         }; |  | ||||||
|  |  | ||||||
|         // Создаем экземпляр типа |  | ||||||
|         return new BoolEx($value); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Проверяет, является ли значение ложью. |  | ||||||
|      * |  | ||||||
|      * @return bool Возвращает, является ли значение ложью. |  | ||||||
|      */ |  | ||||||
|     public function IsFalse (): bool |  | ||||||
|     { |  | ||||||
|         return $this->Value === self::False; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Проверяет, является ли значение истиной. |  | ||||||
|      * |  | ||||||
|      * @return bool Возвращает, является ли значение истиной. |  | ||||||
|      */ |  | ||||||
|     public function IsTrue (): bool |  | ||||||
|     { |  | ||||||
|         return $this->Value === self::True; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Возвращает строковое представление значения. |  | ||||||
|      * |  | ||||||
|      * @return string Возвращает строковое представление значения. |  | ||||||
|      */ |  | ||||||
|     public function __toString (): string |  | ||||||
|     { |  | ||||||
|         // Преобразуем значение в строку |  | ||||||
|         return match ($this->Value) { |  | ||||||
|             self::True => "true", |  | ||||||
|             self::False => "false", |  | ||||||
|             self::Null => "null" |  | ||||||
|         }; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * Конвертирует значение в bool. |  | ||||||
|      * |  | ||||||
|      * @param bool $onNull Значение, возвращаемое при неустановленном значении. |  | ||||||
|      * |  | ||||||
|      * @return bool Возвращает значение, конвертированное в bool. |  | ||||||
|      */ |  | ||||||
|     public function AsBool (bool $onNull = false): bool |  | ||||||
|     { |  | ||||||
|         return match ($this->Value) { |  | ||||||
|             self::True => true, |  | ||||||
|             self::False => false, |  | ||||||
|             default => $onNull |  | ||||||
|         }; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,710 +0,0 @@ | |||||||
| # Описание класса JsonReWriter |  | ||||||
|  |  | ||||||
| ## Информация о версии |  | ||||||
|  |  | ||||||
| Версия класса: 1.0 |  | ||||||
|  |  | ||||||
| Впервые введено в пакет с версии: 1.1.0 |  | ||||||
|  |  | ||||||
| Описание класса: Класс для работы с JSON-файлами. |  | ||||||
|  |  | ||||||
| ## Публичные свойства и константы класса |  | ||||||
|  |  | ||||||
| В классе определены следующие свойства: |  | ||||||
|  |  | ||||||
| - `string $JsonString` - строка JSON (чтение/запись). |  | ||||||
|  |  | ||||||
| ## Быстрый старт |  | ||||||
|  |  | ||||||
| ### Правила формирования ключей. |  | ||||||
|  |  | ||||||
| Ключ для чтения/записи данных класса формируется следующим образом: `ключ/подключ/подключ подключа` . |  | ||||||
|  |  | ||||||
| Например, если дан json-файл: |  | ||||||
|  |  | ||||||
|     { |  | ||||||
| 	    "test": { |  | ||||||
| 	        "subtest": { |  | ||||||
| 	            "AAA": "123", |  | ||||||
| 	            "BBB": 1.23 |  | ||||||
| 	        } |  | ||||||
| 	    }, |  | ||||||
| 	    "test1": { |  | ||||||
| 	        "test": 123 |  | ||||||
| 	    }, |  | ||||||
| 	    "test2": { |  | ||||||
| 	        "test": true |  | ||||||
| 	    }, |  | ||||||
| 	    "test3": { |  | ||||||
| 	        "test": { |  | ||||||
| 	            "res": "[1,2,3]" |  | ||||||
| 	        } |  | ||||||
| 	    } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| Пусть требуется получить значение `BBB`, тогда ключ должен быть `test/subtest/BBB`. |  | ||||||
|  |  | ||||||
| ### Чтение. |  | ||||||
|  |  | ||||||
| 1. Создайте элемент класса `$json = new JsonReWriter ();` |  | ||||||
| 2. Если у вас требуется загрузить json из файла `$fileName`, то воспользуйтесь методом `LoadFromFile`: |  | ||||||
|    `$json->LoadFromFile($fileName);`, если же json представлен строкой `$jsonStr`, то загрузите её в свойство |  | ||||||
|    `$JsonString`: `$json->JsonString = $jsonStr;` |  | ||||||
| 3. Далее можно пользоваться любым методом для чтения `Read*`, в том числе и общим `$json->Read(...)`. |  | ||||||
|  |  | ||||||
| **Пример:** |  | ||||||
|  |  | ||||||
| 	// Имя файла |  | ||||||
|     $fileName = __DIR__ . "/test.json"; |  | ||||||
|     // Создаю класс |  | ||||||
| 	$json = new JsonReWriter(); |  | ||||||
| 	// Загшружаю данные из файла |  | ||||||
| 	$json->LoadFromFile($fileName); |  | ||||||
| 	// Получаю число |  | ||||||
| 	$float = $json->ReadFloat("test/subtest/BBB", 0.2); |  | ||||||
|  |  | ||||||
| В итоге в `$float` будет `1.23`. |  | ||||||
|  |  | ||||||
| ### Запись. |  | ||||||
|  |  | ||||||
| 1. Создайте элемент класса `$json = new JsonReWriter ();` |  | ||||||
| 2. Далее можно пользоваться любым методом для записи `Write*`, в том числе и общим `$json->Write(...)`. |  | ||||||
| 3. Если вам требуется создать json файл с именем `$fileName`, то воспользуйтесь методом `SaveToFile`: |  | ||||||
|    `$json->SaveToFile($fileName);`, если же json должен быть представлен строкой `$jsonStr`, то загрузите её из свойства |  | ||||||
|    `$JsonString`: `$jsonStr = $json->JsonString;` |  | ||||||
|  |  | ||||||
| **Пример:** |  | ||||||
|  |  | ||||||
| 	// Имя файла |  | ||||||
|     $fileName = __DIR__ . "/test.json"; |  | ||||||
|     // Создаю класс |  | ||||||
| 	$json = new JsonReWriter(); |  | ||||||
| 	// Загшружаю данные из файла |  | ||||||
| 	$json->LoadFromFile($fileName); |  | ||||||
| 	// Получаю число |  | ||||||
| 	try { |  | ||||||
| 		$json->Write("test/subtest/BBB", 0.2); |  | ||||||
| 	} |  | ||||||
| 	catch (JsonException $e) { |  | ||||||
| 		echo $e->getMessage(); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| В итоге в `test/subtest/BBB` вместо `1.23` будет `0.2`. |  | ||||||
|  |  | ||||||
| ## Коды ошибок JsonErrorCode |  | ||||||
|  |  | ||||||
| Ниже представлена таблица основных кодов ошибки: |  | ||||||
|  |  | ||||||
| |       Ошибка        |                                  Описание                                   | Введено с версии |   |  | ||||||
| |:-------------------:|:---------------------------------------------------------------------------:|:----------------:|   |  | ||||||
| |       Unknown       |                             Неизвестная ошибка                              |       1.0        |   |  | ||||||
| |        None         |                                 Ошибок нет                                  |       1.0        |   |  | ||||||
| |        Depth        |                    Достигнута максимальная глубина стека                    |       1.0        |   |  | ||||||
| |    StateMismatch    |                       Неверный или некорректный JSON                        |       1.0        |   |  | ||||||
| |      CTRLChar       |          Ошибка управляющего символа, возможно, неверная кодировка          |       1.0        |   |  | ||||||
| |       Syntax        |                            Синтаксическая ошибка                            |       1.0        |   |  | ||||||
| |        UTF8         |   Некорректные для кодировки UTF-8 символы, возможно, неверная кодировка    |       1.0        |   |  | ||||||
| |      Recursion      |         Одна или несколько зацикленных ссылок в кодируемом значении         |       1.0        |   |  | ||||||
| |      InfOrNan       |        Одно или несколько значений NAN или INF в кодируемом значении        |       1.0        |   |  | ||||||
| |   UnsupportedType   |                 Передали значение с неподдерживаемым типом                  |       1.0        |   |  | ||||||
| | InvalidPropertyName |                   Имя свойства не может быть закодировано                   |       1.0        |   |  | ||||||
| |        UTF16        | Некорректный для кодировки UTF-16 символ, возможно, некорректно закодирован |       1.0        |   |  | ||||||
| |    KeyIsNotArray    |         Ключ не содержит вложений, хотя от него требуется обратное          |       1.0        |   |  | ||||||
| |  NotISerializable   |                 Класс не реализует интерфейс ISerializable                  |       1.0        | |  | ||||||
|  |  | ||||||
| ### Методы и функции перечисления JsonErrorCode |  | ||||||
|  |  | ||||||
| Перечисление содержит **статический метод** `static function FromLastError (): JsonErrorCode`, который получает код |  | ||||||
| ошибки из последней JSON ошибки. |  | ||||||
|  |  | ||||||
| Например, при успешной загрузке, можем проверить ошибки: |  | ||||||
|  |  | ||||||
|     $errors = JsonErrorCode::FromLastError (); |  | ||||||
|  |  | ||||||
| После того, как мы выведем `$errors`, мы получим `JsonErrorCode::None`. |  | ||||||
|  |  | ||||||
| ## Исключение JsonException |  | ||||||
|  |  | ||||||
| Исключение расширяет класс `Exception`, поэтому может выбрасываться через `throw`. |  | ||||||
|  |  | ||||||
| ### Свойства |  | ||||||
|  |  | ||||||
| Исключение содержит следующие свойства: |  | ||||||
|  |  | ||||||
| - `?string $JsonString` - строка JSON (или null); |  | ||||||
| - `JsonErrorCode $ErrorCode` - код ошибки JSON; |  | ||||||
| - `?string $ErrorMessage` - сообщение об ошибке JSON (в отличие от функции json_last_error_msg(), данная переменная при |  | ||||||
|   отсутствии ошибок выводит null, а не "No error"). |  | ||||||
|  |  | ||||||
| ### Методы и функции |  | ||||||
|  |  | ||||||
| #### Конструктор. |  | ||||||
|  |  | ||||||
| Конструктор принимает **3 необязательных параметра**: |  | ||||||
|  |  | ||||||
| * `?string $json` - строка JSON (по умолчанию, `null`); |  | ||||||
| * `JsonErrorCode $errorCode` - код ошибки (по умолчанию, `JsonErrorCode::Unknown`); |  | ||||||
| * `?string $errorMessage` - сообщение об ошибке (по умолчанию, `null`). |  | ||||||
|  |  | ||||||
| В результате создаётся новое исключение `JsonException`. |  | ||||||
|  |  | ||||||
| Пример: |  | ||||||
|  |  | ||||||
|     throw new JsonException("{}", JsonErrorCode::Depth, "Пример"); |  | ||||||
|  |  | ||||||
| Создаст исключение `JsonException`. |  | ||||||
|  |  | ||||||
| ## Методы и функции |  | ||||||
|  |  | ||||||
| ### Конструктор и деструктор. |  | ||||||
|  |  | ||||||
| Конструктор не принимает никаких параметров. |  | ||||||
|  |  | ||||||
| В результате создаётся новый класс `JsonReWriter`. |  | ||||||
|  |  | ||||||
| **Пример:** |  | ||||||
|  |  | ||||||
|     // Контсуктор |  | ||||||
|     $json = new JsonReWriter (); |  | ||||||
|     // Деструктор |  | ||||||
|     unset($json); |  | ||||||
|  |  | ||||||
| Создаст и уничтожит класс `JsonReWriter`. |  | ||||||
|  |  | ||||||
| ### Сохранение и загрузка из файла. |  | ||||||
|  |  | ||||||
| За сохранение и загрузку отвечают 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` будет следующим массивом: |  | ||||||
|  |  | ||||||
|     [ |  | ||||||
|     ] |  | ||||||
		Reference in New Issue
	
	Block a user