20250714 1.1.3
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -83,3 +83,4 @@ vendor/ | |||||||
| /tests/classesserialized1.txt | /tests/classesserialized1.txt | ||||||
| /tests/classesserialized2.txt | /tests/classesserialized2.txt | ||||||
| /tests/classesserialized3.txt | /tests/classesserialized3.txt | ||||||
|  | /tests/classesserialized4.txt | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ namespace goodboyalex\php_components_pack\classes; | |||||||
|  |  | ||||||
| use ArrayAccess; | use ArrayAccess; | ||||||
| use Countable; | use Countable; | ||||||
|  | use goodboyalex\php_components_pack\interfaces\IArrayable; | ||||||
| use goodboyalex\php_components_pack\interfaces\ISerializable; | use goodboyalex\php_components_pack\interfaces\ISerializable; | ||||||
| use goodboyalex\php_components_pack\traits\ArrayBasicTrait; | use goodboyalex\php_components_pack\traits\ArrayBasicTrait; | ||||||
| use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArrayConstantsTrait; | use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArrayConstantsTrait; | ||||||
| @@ -11,6 +12,7 @@ use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArrayLINQTrait; | |||||||
| use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArraySearchAndSortTrait; | use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArraySearchAndSortTrait; | ||||||
| use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArraySerializeExTrait; | use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArraySerializeExTrait; | ||||||
| use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArraySpecialTrait; | use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArraySpecialTrait; | ||||||
|  | use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArrayToArrayTrait; | ||||||
| use IteratorAggregate; | use IteratorAggregate; | ||||||
|  |  | ||||||
| /** | /** | ||||||
| @@ -21,7 +23,7 @@ use IteratorAggregate; | |||||||
|  * @version 1.0.6 |  * @version 1.0.6 | ||||||
|  * @since 1.0 |  * @since 1.0 | ||||||
|  */ |  */ | ||||||
| final class ObjectArray implements ArrayAccess, IteratorAggregate, Countable, ISerializable | final class ObjectArray implements ArrayAccess, IteratorAggregate, Countable, ISerializable, IArrayable | ||||||
| { | { | ||||||
|     /** |     /** | ||||||
|      * @var array $Container Массив объектов, хранящихся в данном классе. |      * @var array $Container Массив объектов, хранящихся в данном классе. | ||||||
| @@ -46,6 +48,9 @@ final class ObjectArray implements ArrayAccess, IteratorAggregate, Countable, IS | |||||||
|     // Расширенные методы для сериализации |     // Расширенные методы для сериализации | ||||||
|     use ObjectArraySerializeExTrait; |     use ObjectArraySerializeExTrait; | ||||||
|  |  | ||||||
|  |     // Реализация методов интерфейса IArrayable | ||||||
|  |     use ObjectArrayToArrayTrait; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Конструктор класса. |      * Конструктор класса. | ||||||
|      * |      * | ||||||
|   | |||||||
| @@ -51,7 +51,7 @@ trait ObjectArraySpecialTrait | |||||||
|     public function AddRange (ObjectArray|array $objects): void |     public function AddRange (ObjectArray|array $objects): void | ||||||
|     { |     { | ||||||
|         // Если передан массив, то не изменяем его, а если передан объект класса ObjectArray, то конвертируем его в массив объектов |         // Если передан массив, то не изменяем его, а если передан объект класса ObjectArray, то конвертируем его в массив объектов | ||||||
|         $objectsToAdd = is_array($objects) ? $objects : $objects->ToArray(); |         $objectsToAdd = is_array($objects) ? $objects : $objects->AsArray(); | ||||||
|  |  | ||||||
|         // Добавляем массив объектов |         // Добавляем массив объектов | ||||||
|         $this->Merge($objectsToAdd); |         $this->Merge($objectsToAdd); | ||||||
| @@ -62,7 +62,7 @@ trait ObjectArraySpecialTrait | |||||||
|      * |      * | ||||||
|      * @return array Массив объектов, хранящихся в данном классе. |      * @return array Массив объектов, хранящихся в данном классе. | ||||||
|      */ |      */ | ||||||
|     public function ToArray (): array |     public function AsArray (): array | ||||||
|     { |     { | ||||||
|         return $this->Container; |         return $this->Container; | ||||||
|     } |     } | ||||||
|   | |||||||
							
								
								
									
										104
									
								
								sources/traits/ObjectArray/ObjectArrayToArrayTrait.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								sources/traits/ObjectArray/ObjectArrayToArrayTrait.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | namespace goodboyalex\php_components_pack\traits\ObjectArray; | ||||||
|  |  | ||||||
|  | use goodboyalex\php_components_pack\classes\ObjectArray; | ||||||
|  | use goodboyalex\php_components_pack\exceptions\TypeException; | ||||||
|  | use goodboyalex\php_components_pack\extensions\TypeExtension; | ||||||
|  | use goodboyalex\php_components_pack\interfaces\IArrayable; | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Часть кода класса ObjectArray, отвечающая за реализацию интерфейса Arrayable. | ||||||
|  |  * | ||||||
|  |  * @author Александр Бабаев | ||||||
|  |  * @package php_components_pack | ||||||
|  |  * @version 1.0 | ||||||
|  |  * @since 1.1.3 | ||||||
|  |  */ | ||||||
|  | trait ObjectArrayToArrayTrait | ||||||
|  | { | ||||||
|  |     /** | ||||||
|  |      * @inheritDoc | ||||||
|  |      * @throws TypeException Если в массиве есть объекты, которые невозможно преобразовать в массив (происходит ошибка | ||||||
|  |      *     метода ToArray из класса TypeExtension). | ||||||
|  |      */ | ||||||
|  |     public function ToArray (): array | ||||||
|  |     { | ||||||
|  |         // Создаю массив | ||||||
|  |         $result = [ | ||||||
|  |             "type_class" => ObjectArray::class | ||||||
|  |         ]; | ||||||
|  |  | ||||||
|  |         // Перебираю все элементы | ||||||
|  |         foreach ($this->Container as $item) { | ||||||
|  |             // - если элемент реализует интерфейс IArrayable | ||||||
|  |             if ($item instanceof IArrayable) | ||||||
|  |                 // -- то вызываю метод ToArray и добавляю в массив его результат | ||||||
|  |                 $result[] = $item->ToArray(); | ||||||
|  |             else | ||||||
|  |                 // -- иначе вызываю метод ToArray из класса TypeExtension и добавляю в массив его результат | ||||||
|  |                 $result[] = TypeExtension::ToArray($item); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Возвращаю массив | ||||||
|  |         return $result; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * @inheritDoc | ||||||
|  |      * @throws TypeException Если в массиве есть объекты, которые невозможно преобразовать в массив (происходит ошибка | ||||||
|  |      *     метода FromArray из класса TypeExtension) или класс не существует. | ||||||
|  |      */ | ||||||
|  |     public function FromArray (array $array): void | ||||||
|  |     { | ||||||
|  |         // Очищаю массив | ||||||
|  |         $this->Clear(); | ||||||
|  |  | ||||||
|  |         // Перебираю все элементы массива | ||||||
|  |         foreach ($array as $key => $value) { | ||||||
|  |             // - пропускаю специальные элементы, которые не являются объектами | ||||||
|  |             if ($key == "type_class") | ||||||
|  |                 continue; | ||||||
|  |  | ||||||
|  |             // - если элемент реализует интерфейс IArrayable | ||||||
|  |             if ($this->IsArrayable($value)) { | ||||||
|  |                 // -- то получаю имя класса | ||||||
|  |                 $className = $array["type_class"]; | ||||||
|  |                 // -- создаю объект | ||||||
|  |                 $instance = new $className(); | ||||||
|  |                 // -- вызываю метод FromArray | ||||||
|  |                 $instance->FromArray($value); | ||||||
|  |                 // -- и добавляю в массив | ||||||
|  |                 $this->Container[] = $instance; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |                 // -- иначе вызываю метод FromArray из класса TypeExtension | ||||||
|  |                 $this->Container[] = TypeExtension::FromArray($value, TypeExtension::DEFAULT_FROM_ARRAY_ON_CLASS()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Проверяет, реализует ли класс интерфейс IArrayable. | ||||||
|  |      * | ||||||
|  |      * @param array $array Массив. | ||||||
|  |      * | ||||||
|  |      * @return bool Возвращает <code>true</code>, если класс реализует интерфейс <code>IArrayable</code>, иначе | ||||||
|  |      *     <code>false</code>. | ||||||
|  |      * @throws TypeException Если класс не существует. | ||||||
|  |      */ | ||||||
|  |     private function IsArrayable (array $array): bool | ||||||
|  |     { | ||||||
|  |         // Получаю имя класса | ||||||
|  |         $className = $array["type_class"]; | ||||||
|  |  | ||||||
|  |         // Проверяем, существует ли класс вообще | ||||||
|  |         if (!class_exists($className)) | ||||||
|  |             throw new TypeException($className, "Class $className is not exists / Класс $className не существует"); | ||||||
|  |  | ||||||
|  |         // Получаем список всех интерфейсов, реализуемых данным классом | ||||||
|  |         $interfaces = class_implements($className); | ||||||
|  |  | ||||||
|  |         // Проверка, присутствует ли IArrayable среди списка реализованных интерфейсов и возвращаем результат | ||||||
|  |         return in_array('IArrayable', $interfaces); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -228,7 +228,7 @@ class ObjectArrayTest extends TestCase | |||||||
|         $this->assertSame(['c', 'b'], $sr); |         $this->assertSame(['c', 'b'], $sr); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public function testToArray () |     public function testAsArray () | ||||||
|     { |     { | ||||||
|         $this->PrepareForTest(); |         $this->PrepareForTest(); | ||||||
|  |  | ||||||
| @@ -240,7 +240,7 @@ class ObjectArrayTest extends TestCase | |||||||
|  |  | ||||||
|         $a_Array = new ObjectArray($array); |         $a_Array = new ObjectArray($array); | ||||||
|  |  | ||||||
|         $sr = $a_Array->ToArray(); |         $sr = $a_Array->AsArray(); | ||||||
|  |  | ||||||
|         $this->assertIsArray($sr); |         $this->assertIsArray($sr); | ||||||
|         $this->assertSame($array, $sr); |         $this->assertSame($array, $sr); | ||||||
| @@ -550,4 +550,55 @@ class ObjectArrayTest extends TestCase | |||||||
|         $this->assertEquals('test_string_C3', |         $this->assertEquals('test_string_C3', | ||||||
|             $objectArray3->GetRow(fn (D $value) => $value->stringD == 'test_string3')->c->stringC); |             $objectArray3->GetRow(fn (D $value) => $value->stringD == 'test_string3')->c->stringC); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public function testToArray () | ||||||
|  |     { | ||||||
|  |         $this->PrepareForTest(); | ||||||
|  |  | ||||||
|  |         // Создаём тестовые классы | ||||||
|  |         $class1 = new D ('test_string1', 12345, true, new A("test_string_A1", 6789, false), | ||||||
|  |             new B("test_string_B1", 9876, "false"), new C("test_string_C1", 54321, true)); | ||||||
|  |         $class2 = new D ('test_string2', 123456, false, new A("test_string_A1", 678910, true), | ||||||
|  |             new B("test_string_B2", 98765, "true"), new C("test_string_C2", 543210, false)); | ||||||
|  |         $class = new D ('test_string3', 123450, true, new A("test_string_A2", 67890, false), | ||||||
|  |             new B("test_string_B3", 90876, "false"), new C("test_string_C3", 543201, true)); | ||||||
|  |  | ||||||
|  |         // Создаём массив объектов | ||||||
|  |         $objectArray = new ObjectArray([$class1, $class2, $class]); | ||||||
|  |  | ||||||
|  |         // Сериализуем | ||||||
|  |         $asArray = $objectArray->ToArray(); | ||||||
|  |  | ||||||
|  |         // Сохраняем в файл | ||||||
|  |         file_put_contents(__DIR__ . 'serialized4.txt', | ||||||
|  |             json_encode($asArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)); | ||||||
|  |  | ||||||
|  |         // Проверяем, что всё хорошо | ||||||
|  |         $this->assertNotEmpty($asArray); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public function testFromArray () | ||||||
|  |     { | ||||||
|  |         $this->PrepareForTest(); | ||||||
|  |  | ||||||
|  |         // Загружаем данные | ||||||
|  |         $serialized = file_get_contents(__DIR__ . 'serialized4.txt'); | ||||||
|  |  | ||||||
|  |         // Десериализуем | ||||||
|  |         $array = json_decode($serialized, true, flags: JSON_UNESCAPED_UNICODE); | ||||||
|  |          | ||||||
|  |         // Создаём массив объектов | ||||||
|  |         $objectArray = new ObjectArray(); | ||||||
|  |          | ||||||
|  |         // Получаем из массива | ||||||
|  |         $objectArray->FromArray($array); | ||||||
|  |  | ||||||
|  |         // Проверяем, что всё хорошо | ||||||
|  |         $this->assertEquals('test_string_A1', | ||||||
|  |             $objectArray->GetRow(fn (D $value) => $value->stringD == 'test_string1')->a->a); | ||||||
|  |         $this->assertEquals('test_string_B2', | ||||||
|  |             $objectArray->GetRow(fn (D $value) => $value->stringD == 'test_string2')->b->a); | ||||||
|  |         $this->assertEquals('test_string_C3', | ||||||
|  |             $objectArray->GetRow(fn (D $value) => $value->stringD == 'test_string3')->c->stringC); | ||||||
|  |     } | ||||||
| } | } | ||||||
		Reference in New Issue
	
	Block a user