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 Возвращает true, если класс реализует интерфейс IArrayable, иначе * false. * @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); } }