Порядок включения файла в зависимости от наследования - PullRequest
0 голосов
/ 22 января 2010

Привет, люди и привет из Швеции!

У меня действительно сложная проблема. Я постараюсь показать, что именно я имею в виду.

Я создаю CMS на основе модулей, и некоторые модули наследуются от родительского модуля. Моя проблема заключается в том, что родительские модули должны быть включены до «детей».

Я извлекаю информацию о модуле из XML-файла и сохраняю его в массиве следующим образом:

Array
(
    [bloggy] => Array
        (
            [module_id] => blog
            [module_name] => Blog
            [module_desc] => Description
            [module_url] => http://www.url.se
            [author] => Dev Name
            [author_url] => http://url.se
            [version] => 1.0
            [inherit] => core|twitter
            [path] => /path/to/file
            [dependon] => Array
                (
                    [0] => core
                    [1] => twitter
                )
        )

Я сделал разнесение по наследству и сохранил его в "зависимость", как вы видите выше. Теперь проблема в том, как я могу отсортировать, в каком порядке включить файлы. Каждый модуль наследуется от ядра, но если в массиве зависимостей есть другой модуль, то после него должен быть включен «дочерний» модуль.

Надеюсь, вы понимаете, о чем я?

// Тобиас

Ответы [ 4 ]

1 голос
/ 22 января 2010

Посмотрите "топологическая сортировка".

0 голосов
/ 22 января 2010

Хм, я попытаюсь объяснить немного лучше.

Я ищу в папке модуля информационный файл xml и сохраняю данные в массив, а также сохраняю путь к файлу в массиве.

Затем я использую цикл foreach для включения и создания экземпляров модулей. Моя проблема заключается в том, что родительские модули должны быть созданы перед «потомками».

Я не хочу прикасаться к файлам ядра при добавлении нового модуля, мне нужно использовать хуки на родительском модуле.

0 голосов
/ 22 января 2010

Просто включите все зависимости в ваши файлы. Попробуйте

// module1.php
require_once 'core.php'

// module2.php
require_once 'core.php'
require_once 'module1.php'

// module3.php
require_once 'core.php'
require_once 'module1.php'
require_once 'module2.php'

Включение модуля 3 также будет включать модуль 2, модуль 1 и ядро. Вы можете оставить ядро ​​и module1 в модуле 3, и они все равно загрузят их, но тогда вы должны знать, что включает в себя.

Или используйте автозагрузку и не беспокойтесь об этом.

0 голосов
/ 22 января 2010

Вы можете создавать свои модули как классы, а затем использовать магическую функцию __autoload, чтобы автоматически включать / запрашивать все необходимые файлы php.

Таким образом, у вас гораздо меньше головной боли, когда у вас сложные зависимости.

Подробнее об автозагрузке см. В руководстве по PHP.

...