Автозагрузка классов

StalkerClasses

Новичок
Можно пример простой функции по автозагрузке классов.

В папке есть два файла
/Class1.php
namespace MyExt;
class Class1 extends Class2 {};
/Class2.php
namespace MyExt;
class Class2 {};

Читаю папку и через include делаю подключение классов.
Но в одном месте есть проблема в том, что у меня идет наследование класса от Class2, а он еще не подключен и соответственно ошибка.
 

fixxxer

К.О.
Партнер клуба
Include? OMFG, ты где последние 10 лет был? На Марс летал?

Просто используй Composer.
 

StalkerClasses

Новичок
Composer использую, но в данном случае мне не очень похдодит.
Поэтому и есть вопрос.
 

StalkerClasses

Новичок
Через композер в основном ставлю только расширения.
Я создал композер в своей папке. И если я добавляю 1 новый php-файл мне всегда нужно делать обновление композера?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Что значит обновление композера?

Что значит тебе не подходит?
 

StalkerClasses

Новичок
Через композер я всегда ставил только расширения и готовые проекты.
Создал композер для своего расширения. В этой папке я создал папку classes/
В нее перетащил все php-классы.

Но столкнулся с проблемой:
PHP:
$models = get_declared_classes();
foreach($models as $km => $m){
    if(strstr($m,'Ivan')){
        print $m . '<br />';
    }
}
Я хочу получить список всех объявленных классов в системе.
Но получается что я не могу этого сделать, т.к. классы не объявлены через use.
 

StalkerClasses

Новичок
В общем мне как-то нужно сделать вот это:

PHP:
PHP предлагает некоторые встроенные функции для получения этих классов (get_declared_classes и т.д.),
Но они не смогут найти классы, которые не были загружены (include/require), поэтому он не будет работать, как ожидается, 
с автозагрузчиками (например, Composer для пример).
Это серьезная проблема, поскольку использование автозагрузчиков очень распространено.
 

StalkerClasses

Новичок
Мне нужно получить список классов в папке - через "get_declared_classes();" я это сделать не могу.
Соотвтественно если я буду просто читать папку и делать include будут ошибки, тот класс не объявлен, тот класс не объявлен и т.д.

Как мне получить список классов в папке?
 

StalkerClasses

Новичок
Также получается что я не могу получить информацию о самом классе.
Если раньше он загружался через include - то я мог получить информацию о том от кого он наследуюется, а также аннотации по данному классу. Классы получаю так:

PHP:
    public static function getLoaderClasses()
    {
        $composer = require $GLOBALS['_SERVER']['DOCUMENT_ROOT'] . '/vendor/autoload.php';
        if (false === empty($composer)) {
           $classes  = array_keys($composer->getClassMap());
        }        
        $allClasses = [];
        if (false === empty($classes)) {
            foreach ($classes as $class) {
                $allClasses[] = '\\' . $class;
            }
        }
        return $allClasses;
    }

    public static function getLoaderClassesByNamespace($namespace)
    {
        if (0 !== strpos($namespace, '\\')) {
            $namespace = '\\' . $namespace;
        }

        $termUpper = strtoupper($namespace);
        return array_filter(self::getLoaderClasses(), function($class) use ($termUpper) {
            $className = strtoupper($class);
            if (
                0 === strpos($className, $termUpper) and
                false === strpos($className, strtoupper('Abstract')) and
                false === strpos($className, strtoupper('Interface'))
            ){
                return $class;
            }
            return false;
        });
    }
 

StalkerClasses

Новичок
если классы именовать по PSR то композеру нужно только сообщить папку.
Код:
{"autoload": {"psr-4": {"MyExt\\": "src"}}}
на крайняк, https://getcomposer.org/doc/03-cli.md#dump-autoload-dumpautoload-
Я сделал проще - у меня эти файлы грузяться и через композер и через include те папки котоыре нужны. Так я могу получить инфу о тех классах которые нужны.
 

ksnk

прохожий
Список моделей ищется glob по файловой маске. В характерном месте/местах сайта. Обычно эти места прописываются в конфиге, или система сама их знает... В друпал, к примеру, все модели имеют расширение не .php, а .model, так как в нормальной модельке может быть значительно более одного файла. Дальше, когда файл нашелся, его можно попробовать отзеркалить - reflectionClass. так можно получить информацию об общем предке (бывает полезно), проверить параметры ключевых методов, если нет интерфейсов, или настроить автоматом вызов, если так и надо.
 

Фанат

oncle terrible
Команда форума
А зачем в админке список моделей вообще
какое дело админу до внутреннего устройства исходного кода?
 
Сверху