104 lines
4.5 KiB
PHP
104 lines
4.5 KiB
PHP
<?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);
|
||
}
|
||
} |