php_components_pack/sources/traits/ObjectArray/ObjectArrayToArrayTrait.php
2025-07-14 16:09:49 +03:00

104 lines
4.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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