Загрузите все классы и после этого выполните все существующие {classname} :: __ initiation ();

0

Я хочу сделать то, что в названии. Например, я включаю все файлы с моими классами:

foreach(glob("library/*.php") as $file)
    include $file;

После этого я определил все свои классы. Некоторые из них имеют статическую функцию, названную, например, __initiation. Как выполнить все из них после включения? Что-то вроде этого:

foreach( {classes} as $class ){
    if( function_exists( $class . '::__initiation' ) )
        $class::__initiation();
}

Я хочу сделать это, потому что некоторые классы должны быть подготовлены (например, подключение к базе данных), а некоторые классы должны использовать другие классы. Часто в обоих направлениях (класс с именем foo должен использовать класс инициации с именем bar, а класс named bar должен использовать класс с именем foo). Кто-нибудь знает, как это сделать?

Пример:

class database{
    // some stuff
    public static __initiation(){
        database::connect();
        foo::bar();
    }
}
class foo{
    // some stuff
    public static bar(){/* blah blah blah */}
    public static __initiation(){
        database::select(/* blah blah blah */);
        foo::start();
    }
}

// Execute all declared {classname}::__initiation() function right now.

Заранее спасибо за помощь.

  • 0
    Разве вы не можете, только после включения $file , сделать $file::__initiation(); ? Если вы назвали свои классы в соответствии с вашими php-файлами, это должно сработать (конечно, после того, как вы удалили расширение вручную).
  • 0
    @D4V1D D4V1D Но если $ file :: __ initiation (); использует еще необъявленный класс? Вот почему я хочу сделать это после включения всех файлов. И не всегда класс называется файлами.
Показать ещё 2 комментария
Теги:
class
function

1 ответ

0
Лучший ответ

Основная проблема, с которой вы столкнетесь, заключается в том, что файлы являются списком в алфавитном порядке. Но зависимости между ними не в этом порядке, например, ссылки на бары foo, foo еще не загружен, когда загружается бар.

Знаете ли вы функциональность __autoload? Вот мой класс AutoLoader, который может вам помочь:

<?php
namespace de\g667\util;

class AutoLoader
{
    /**
     * Registers the autoload-function. All needed classes and interfaces will be
     * automatically loaded on demand.
     */
    static function register() {
        spl_autoload_register(
        function ($class) {
            $class = str_replace ("\\", "/", $class);
            $cwd = getcwd();
            $filepath = $class.'.php';
            $path = PATH . DIRECTORY_SEPARATOR . $filepath;
            if( ! file_exists($path) ){
                error_log("Autoloading $class failed");
            }
            require_once $path;
        }
        );
    }

    static function setPath($path) {
        define("PATH", $path);
    }
}
?>

Сохраните этот код в /library/de/g667/AutoLoader.php

Использование автозагрузчика:

  <?php
  require_once 'library/de/g667/util/AutoLoader.php';

  use de\g667\util\AutoLoader;

  AutoLoader::setPath("/path/to/library");
  AutoLoader::register();
  ?>

Имейте в виду наличие одного файла для каждого класса в библиотеке. Вставьте свой экземпляр funcion в AutoLoader, тогда вы сможете легко создавать экземпляры своих классов.

  • 0
    Я могу использовать это, но это не решение моей проблемы. Я должен включить все классы и затем выполнить все стартовые функции, похожие на: {classname}::__initiation(); , Посмотрите на мой вопрос, я добавил простой пример.
  • 0
    Теперь я понял: get_declared_classes () дает вам массив всех ваших классов после того, как вы их включили. Но для более сложных проектов может быть все время включать каждый php-файл, так что динамическая загрузка с __autoload () может быть хорошей альтернативой.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню