PHPackages                             movephp/classloader - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. movephp/classloader

ActiveLibrary

movephp/classloader
===================

Extended Autoloader for Movephp framework

v1.0.2(8y ago)013Apache-2.0PHPPHP &gt;=7.1

Since Oct 31Pushed 8y ago1 watchersCompare

[ Source](https://github.com/movephp/classloader)[ Packagist](https://packagist.org/packages/movephp/classloader)[ RSS](/packages/movephp-classloader/feed)WikiDiscussions master Synced 3d ago

READMEChangelog (3)Dependencies (2)Versions (4)Used By (0)

[![Build Status](https://camo.githubusercontent.com/132d4b7f8b8baf8b05c8979087d2b9fc5cab647db46016813c32f46dd5687103/68747470733a2f2f7472617669732d63692e6f72672f6d6f76657068702f636c6173736c6f616465722e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/movephp/classloader)[![Coverage Status](https://camo.githubusercontent.com/08c69cad7811a9161599fac128285aa83bca54e2ba03fa2d5cc2f51443b7961d/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d6f76657068702f636c6173736c6f616465722f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/movephp/classloader?branch=master)

Расширенный Autoloader для фреймворка Movephp
=============================================

[](#расширенный-autoloader-для-фреймворка-movephp)

Это механизм для создания карты классов приложения. Он сканирует указанные каталоги в поисках **\*.php** файлов и составляет список всех найденных классов (в т.ч. абстрактных, а также интерфейсов и трейтов). Для каждого класса также определяется пространство имён, родительский класс, используемые интерфейсы и трейты, классы-потомки.

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

Например, можно найти все классы, имеющие в дереве родительских классов указанный, или можно найти все классы, использующие определённый трейт и т.д.

Это позволяет быстро анализировать код приложения и выполнять препроцессинг.

Оглавление
----------

[](#оглавление)

- [Установка](#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0)
- [Быстрый старт](#%D0%91%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9-%D1%81%D1%82%D0%B0%D1%80%D1%82)
- [Автозагрузчик](#%D0%90%D0%B2%D1%82%D0%BE%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D1%87%D0%B8%D0%BA)
- [Обновление карты](#%D0%9E%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D0%BA%D0%B0%D1%80%D1%82%D1%8B)
- [Настройки сканирования](#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8-%D1%81%D0%BA%D0%B0%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)
- [Особые случаи](#%D0%9E%D1%81%D0%BE%D0%B1%D1%8B%D0%B5-%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B8)
    - [Composer-пакеты](#composer-%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D1%8B)
    - [PHPUnit и библиотека Composer](#phpunit-%D0%B8-%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0-composer)
    - [Классы с возможными ошибками](#%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B-%D1%81-%D0%B2%D0%BE%D0%B7%D0%BC%D0%BE%D0%B6%D0%BD%D1%8B%D0%BC%D0%B8-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0%D0%BC%D0%B8)
- [Поиск и анализ классов](#%D0%9F%D0%BE%D0%B8%D1%81%D0%BA-%D0%B8-%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%BE%D0%B2)
- [API Reference](#api-reference)
    - [`Movephp\ClassLoader\Autoload`](#movephpclassloaderautoload)
        - [Конструктор](#%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80)
        - [Методы](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B)
    - [`Movephp\ClassLoader\Map\Map`](#movephpclassloadermapmap)
        - [Конструктор](#%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80-1)
        - [Методы](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-1)
    - [`Movephp\ClassLoader\Map\Item`](#movephpclassloadermapitem)
        - [Методы](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-2)
- [TODO](#todo)

Установка
---------

[](#установка)

Рекомендуемый способ установки - с использованием **Composer**. Добавьте следующую инструкцию в ваш `composer.json` файл:

```
"require": {
    "movephp/classloader": "~1.0"
}

```

Быстрый старт
-------------

[](#быстрый-старт)

Пример кода для быстрого старта:

```
include_once('vendor/autoload.php');
use Movephp\ClassLoader\{Autoload, Map};
$autoload = new Autoload(
    new Map\Map()
);
$autoload->setScanPaths(__DIR__ . '/src', __DIR__ . '/vendor');
$autoload->makeMap();
var_dump($autoload->map()->classes());

```

Автозагрузчик
-------------

[](#автозагрузчик)

Зарегистрировать функцию автозагрузки классов из составленной карты можно методом `$autoload->register()`.

Для использования данной библиотеки в качестве автозагрузчика классов рекомендуется использовать кеширование (PSR-6).

```
$cachePool = new Symfony\Component\Cache\Adapter\FilesystemAdapter();
$autoload = new Autoload(
    new Map\Map(),
    $cachePool
);
$autoload->setScanPaths(__DIR__ . '/src', __DIR__ . '/vendor');
$autoload->makeMap();
$autoload->register();

```

При использовании кеширования карта классов будет сформирована только один раз, а при следующих обращениях данные будут быстро восстановлены из кеша.

> По-умолчанию библиотека использует ключ `movephp_classloader` для получения `CacheItem` из переданного `CachePool`. Для предотвращения возможных коллизий третьим аргументом в конструктор класса `Autoload` можно передать пространство имён для ключа CacheItem: `$autoload = new Autoload($map, $cachePool, 'mynamespace')` - в этом случае для получения `CacheItem` будет использован ключ `mynamespace_movephp_classloader`.

Обновление карты
----------------

[](#обновление-карты)

В dev-окружении или при работе над проектом может потребоваться обновить карту классов:

```
$cachePool = new Symfony\Component\Cache\Adapter\FilesystemAdapter();
$autoload = new Autoload(
    new Map\Map(),
    $cachePool
);
$autoload->setScanPaths(__DIR__ . '/src', __DIR__ . '/vendor');
$autoload->makeMap();
if (...some_сondition_here...) {
    $autoload->updateMap();
}
$autoload->register();

```

Другой вариант, более медленный, - полностью сбросить кеш и сформировать карту заново:

```
$cachePool = new Symfony\Component\Cache\Adapter\FilesystemAdapter();
if (...some_сondition_here...) {
    $cachePool->clear();
}
$autoload = new Autoload(
    new Map\Map(),
    $cachePool
);
$autoload->setScanPaths(__DIR__ . '/src', __DIR__ . '/vendor');
$autoload->makeMap();
$autoload->register();

```

Настройки сканирования
----------------------

[](#настройки-сканирования)

Помимо метода `$autoload->setScanPaths()` для указания того, какие файлы/каталоги должны быть просканированы, существует два дополнительных метода:

- `$autoload->setExcludingPaths(string ...$excludePaths)` - исключает указанные файлы и каталоги (и всё их содержимое) из процесса сканирования. Имеет смысл использовать эту возможность для каталогов с тестами.
- `$autoload->setOverridePaths(string ...$overridePaths)` - в случае, если при сканировании проекта будет обнаружено несколько классов с одинаковым именем (включая пространство имён), возникнет ошибка. Однако данный метод позволяет указать файлы/каталоги, в которых могут содержаться классы, заменяющие одноимённые классы в других сканируемых файлах. В этом случае не будет ошибки, а в карту попадут классы из `$overridePaths`.

Особые случаи
-------------

[](#особые-случаи)

### Composer-пакеты

[](#composer-пакеты)

При сканировании файлов проекта особое внимание уделяются файлам `composer.json`. При обнаружении такого файла, если он содержит директиву `autoload`, сканироваться будут только каталоги и файлы, описанные в ней.

Остальные файлы в найденном composer-пакете будут пропущены, т.к., вероятно, нужны там лишь для тестов или просто являются мусором.

### PHPUnit и библиотека Composer

[](#phpunit-и-библиотека-composer)

Класс не будет включён в карту классов и не будет доступен как для автозагрузки, так и для анализа, в следующих случаях:

- Если класс является тестом **phpUnit**, т.е. если он или один из его родителей унаследован от классов `PHPUnit_Framework_TestCase` или `PHPUnit\Framework\TestCase`;
- Если класс является частью библиотеки **Composer**, т.е. определён в пространстве имён `Composer` или в любом подпространстве `Composer\...`.

### Классы с возможными ошибками

[](#классы-с-возможными-ошибками)

Класс будет включен в карту классов, но не будет доступен для автозагрузки в следующих случаях:

- Если в коде файла с классом встречается оператор `exit()` (или `die()`) вне тела класса, т.е. он может быть вызван в момент подключения файла к приложению.
- Если класс унаследован от класса, который не представлен в общей карте классов и не является встроенным в PHP классом. Тоже касается используемых трейтов и интерфейсов.

> Такой класс получит особую отметку `$item->isSafeInclude() === false`, которая означает, что подключение файла с данным классом может привести к ошибке или неожиданному завершению скрипта. Однако класс будет присутствовать в карте классов и будет доступен для анализа.

Поиск и анализ классов
----------------------

[](#поиск-и-анализ-классов)

Сформированную карту классов - объект `Map\Map` - можно получить методом `$autoload->map()`. Также, если вам не нужны функции автозагрузки и кеширования, вы можете сразу напрямую использовать класс `Map\Map` и его метод `scan()`:

```
$map = new Map\Map();
$map->scan([__DIR__ . '/src', __DIR__ . '/vendor']);

```

Метод `Map\Map::classes()` возвращает полный список всех классов в карте в виде массива объектов `Map\Item`.

С помощью метода `Map\Map::find()` можно осуществлять поиск среди классов в карте по заданным параметрам. Пример поиска неабстрактных классов, реализующих интерфейс `MyNamespace\MyInterface`, а также потомков этих классов:

```
$map->find(Map\Item::TYPE_CLASS, MyNamespace\MyInterface::class);

```

Метод `find()` также возвращает массив объектов `Map\Item`.

Объекты `Map\Item` - элементы карты - имеют много методов-геттеров для получения всевозможной информации о представляемом ими классе.

API Reference
-------------

[](#api-reference)

### `Movephp\ClassLoader\Autoload`

[](#movephpclassloaderautoload)

Основной класс библиотеки. Используется для выполнения функции автозагрузчика на основе карты классов, а также для управления объектом карты и его кешированием.

#### Конструктор

[](#конструктор)

```
__construct(Movephp\ClassLoader\Map\MapInterface $cleanMap, Psr\Cache\CacheItemPoolInterface $cachePool = null, string $cacheKeyNamespace = '')

```

АргументТипПо-умолчаниюОписание`$cleanMap``Movephp\ClassLoader\Map\MapInterface`DI для создания объекта карты.`$cachePool``Psr\Cache\CacheItemPoolInterface``null`Объект кеша для кеширования карты. Кеширование не выполняется, если этот аргумент не задан.`$cacheKeyNamespace``string`Пустая строкаПространство имён для ключа элемента кеша.#### Методы

[](#методы)

МетодОписание`setScanPaths(string ...$scanPaths): void`Устанавливает пути к сканируемым каталогам и файлам. **Вызов этого метода обязателен до выполнения сканирования.**`setExcludingPaths(string ...$excludePaths): void`Указывает каталоги и файлы, которые должны быть пропущены при сканировании. **Метод следует вызывать до выполнения сканирования.**`setOverridePaths(string ...$overridePaths): void`В случае обнаружения нескольких классов с идентичными именами (включая пространство имён), классы в каталогах/файлах, указанных через данный метод попадут в карту. Если же данный метод не используется, при обнаружении дубликатов классов, в момент создания карты классов будет выброшено исключение `Movephp\ClassLoader\Exception\ClassDuplicateException`. **Метод следует вызывать до выполнения сканирования.**`makeMap(): void`Пытается загрузить объект карты классов из кеша и, в случае неудачи, выполняет сканирование файлов, создаёт новую карту и сохраняет её в кеш.`updateMap(): void`Данный метод обновляет карту, загруженную из кеша при вызове `makeMap()`. Такое обновление выполняется значительно быстрее, чем составление карты с нуля. В целом карта может быть создана/обновлена только один раз за один запуск скрипта, поэтому многократные вызовы данного метода ничего не изменят. Если кеширование не используется, данный метод не окажет никакого эффекта.`map(): Map\MapInterface`Возвращает объект карты классов. **Если метод `makeMap()` не был вызван предварительно, он выполнится автоматически.**`isClassExists(string $className, Map\ItemInterface &$item = null): bool`По имени класса (fully qualified) определяет, имеется ли он в карте классов. Если передан второй аргумент, в него по ссылке записывается объект, представляющий соответствующий элемент карты (если класс найден в карте). **Если метод `makeMap()` не был вызван предварительно, он выполнится автоматически.**`load(string $className): void`Загружает файл с классом с помощью `include_once()`, если указанный класс существует в карте и если он безопасен для подключения (см. описание `Movephp\ClassLoader\Map\Item::isSafeInclude()`).`isClassLoaded(string $className): bool`Определяет, был ли указанный класс ранее загружен с помощью метод `load()`.`register(): void`Регистрирует метод `load()` в качестве автозагрузчика классов с помощью функции `spl_autoload_register(..., true, true)`.### `Movephp\ClassLoader\Map\Map`

[](#movephpclassloadermapmap)

Объект данного класса представляет карту классов и используется для её составления (сканирования файлов проекта) и поиска по ней.

#### Конструктор

[](#конструктор-1)

```
__construct(string $itemClass = '')

```

АргументТипПо-умолчаниюОписание`$itemClass``string`Пустая строкаDI для указания имени класса элемента карты. Если не задан, будет использоваться класс `Movephp\ClassLoader\Map\Item`. Используется, в основном, для тестирования.#### Методы

[](#методы-1)

МетодОписание`scan(array $scanPaths, array $excludePaths = [], array $overridePaths = []): int`Выполняет сканирование файлов проекта для формирования карты классов. Все три аргумента - массивы строк, по смыслу идентичные аргументам методов `setScanPaths()`, `setExcludingPaths()` и `setOverridePaths()` класса `Movephp\ClassLoader\Autoload`. Повторный вызов этого метода выполняет обновление карты, которое происходит быстрее, чем полное сканирование.`classes(): array`Возвращает полный список всех включённых в карту классов, найденных при сканировании, в виде массива объектов класса `Movephp\ClassLoader\Map\Item`.`find(int $type = Movephp\ClassLoader\Map\ItemInterface::TYPE_ANY, string $parentClassName = '', bool $includableOnly = true): array`Выполняет поиск среди элементов карты классов по заданным параметрам. `$type` - тип элементов, которые необходимо найти, возможные значения см. ниже. `$parentClassName` - если указано, будут найдены только потомки класса с этим именем. `$includableOnly` - если `false`, будут найдены также классы, небезопасные для подключения (см. `Movephp\ClassLoader\Map\Item::isSafeInclude()`).**Возможные значения аргумента `$type` метода `find()`:**

- `Movephp\ClassLoader\Map\ItemInterface::TYPE_CLASS`
- `Movephp\ClassLoader\Map\ItemInterface::TYPE_ABSTRACT`
- `Movephp\ClassLoader\Map\ItemInterface::TYPE_INTERFACE`
- `Movephp\ClassLoader\Map\ItemInterface::TYPE_TRAIT`
- или любая сумма этих констант (`Movephp\ClassLoader\Map\ItemInterface::TYPE_ANY` - это сумма их всех).

### `Movephp\ClassLoader\Map\Item`

[](#movephpclassloadermapitem)

Объект данного класса представляет один элемент карты: класс, интерфейс или трейт, найденный при сканировании.

#### Методы

[](#методы-2)

МетодОписание`getFilePath(): string`Путь к файлу, где объяслен класс.`getType(): int`Одна из следующих констант: `Movephp\ClassLoader\Map\ItemInterface::TYPE_CLASS`, `Movephp\ClassLoader\Map\ItemInterface::TYPE_ABSTRACT`, `Movephp\ClassLoader\Map\ItemInterface::TYPE_INTERFACE`, `Movephp\ClassLoader\Map\ItemInterface::TYPE_TRAIT``getNamespace(): string`Пространство имён класса.`getName(): string`Имя класса (fully qualified).`getImports(): array`Возвращает массив строк - импортируемые классом пространства имён.`getParent(): string`Имя родительского класса.`getInterfaces(): array`Возвращает массив строк - имена реализуемых классом интерфейсов.`getTraits(): array`Возвращает массив строк - имена используемых классом трейтов.`getParents(): array`Возвращает массив строк - полная цепочка родительских классов.`getInheritors(): array`Возвращает массив строк - полный список всех потомков (включая потомков их потомков и т.д.)`isSafeInclude(): bool`Может ли файл с классом быть безопасно подключен в приложение.`isParsedJustNow(): bool`Был ли данный класс обновлён только что, в ходе текущего запуска приолжения (`false`, если класс был получен из кеша).---

TODO
----

[](#todo)

- Сделать возможным использование спец. символов `*` и `?` при указании списка сканируемых и исключаемых из сканирования директорий и файлов;
- Настройка расширений сканируемых файлов (по-умолчанию `*.php`);
- Избавиться от прямых обращений к функциям файловой системы (использовать `Flysystem` или аналог).

###  Health Score

26

—

LowBetter than 43% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity5

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity60

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~13 days

Total

3

Last Release

3091d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/b086717a3f91192a67a4d5ddad6154ec01a7120cf606d7b5e385c4167e0146b7?d=identicon)[Alexey Sinkevich](/maintainers/Alexey%20Sinkevich)

---

Top Contributors

[![seka19](https://avatars.githubusercontent.com/u/2714877?v=4)](https://github.com/seka19 "seka19 (12 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/movephp-classloader/health.svg)

```
[![Health](https://phpackages.com/badges/movephp-classloader/health.svg)](https://phpackages.com/packages/movephp-classloader)
```

###  Alternatives

[symfony/symfony

The Symfony PHP framework

31.3k86.3M2.2k](/packages/symfony-symfony)[doctrine/dbal

Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.

9.7k578.4M5.6k](/packages/doctrine-dbal)[symfony/cache

Provides extended PSR-6, PSR-16 (and tags) implementations

4.2k348.9M2.5k](/packages/symfony-cache)[google/auth

Google Auth Library for PHP

1.4k272.7M162](/packages/google-auth)[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.4k5.6M651](/packages/sylius-sylius)[nelmio/api-doc-bundle

Generates documentation for your REST API from attributes

2.3k63.6M233](/packages/nelmio-api-doc-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
