20250714 1.1.3

This commit is contained in:
2025-07-14 16:09:49 +03:00
parent e342c7f41f
commit 2c3ea12fc1
5 changed files with 166 additions and 5 deletions

View File

@@ -51,7 +51,7 @@ trait ObjectArraySpecialTrait
public function AddRange (ObjectArray|array $objects): void
{
// Если передан массив, то не изменяем его, а если передан объект класса ObjectArray, то конвертируем его в массив объектов
$objectsToAdd = is_array($objects) ? $objects : $objects->ToArray();
$objectsToAdd = is_array($objects) ? $objects : $objects->AsArray();
// Добавляем массив объектов
$this->Merge($objectsToAdd);
@@ -62,7 +62,7 @@ trait ObjectArraySpecialTrait
*
* @return array Массив объектов, хранящихся в данном классе.
*/
public function ToArray (): array
public function AsArray (): array
{
return $this->Container;
}

View 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);
}
}