Список классов PHP: основные способы и практические примеры

Раздел: Основы PHP -> ООП в PHP

Способы получения списка классов в PHP

Как получить полный перечень всех объявленных классов?

Наиболее эффективный способ - встроенная функция get_declared_classes(). Она возвращает массив строк с именами всех классов, которые были объявлены на момент вызова (включая внутренние классы PHP и пользовательские).


<?php
// Вызов в начале скрипта покажет только встроенные классы
$classes = get_declared_classes();
echo count($classes) . ' классов объявлено';
?>
  

List php class (список классов php)

Примерный вывод (количество может отличаться): 183 классов объявлено
  

Php проверить класс (проверить класс в php)

Чтобы увидеть пользовательские классы, их нужно предварительно объявить или подключить файлы.

Типичная ошибка: функция возвращает только те классы, которые уже объявлены. Если файл с классом не подключён, результат будет неполным.

Решение: убедитесь, что все необходимые файлы подключены через require или используйте автозагрузку с принудительной загрузкой всех классов.

Как проверить существование конкретного класса?

Для одного класса используется class_exists(). Она возвращает true, если класс объявлен, иначе false. Третий параметр позволяет включить автозагрузку.


<?php
// Подключение файла с классом
require_once 'MyClass.php'; 
if (class_exists('MyClass')) {
    echo 'Класс MyClass существует';
}
?>
  

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

Решение: всегда передавайте true или убедитесь, что файлы загружены вручную.

Как отфильтровать только пользовательские классы?

Комбинация get_declared_classes() и ReflectionClass позволяет оставить только классы, определённые пользователем (не встроенные).


<?php
function getUserClasses() {
    $all = get_declared_classes();
    $userClasses = [];
    foreach ($all as $className) {
        $ref = new ReflectionClass($className);
        if ($ref->isUserDefined()) {
            $userClasses[] = $className;
        }
    }
    return $userClasses;
}
print_r(getUserClasses());
?>
  
Array
(
    [0] => MyClass
    [1] => AnotherClass
)
  

Ошибка: ReflectionClass может выбросить исключение, если класс не найден. В данном случае классы уже существуют, поэтому исключение не возникает.

Как получить список классов из определённой директории?

Используется ручное сканирование файловой системы с последующим включением файлов и вызовом get_declared_classes(). Этот подход подходит, когда автозагрузка ещё не настроена.


<?php
function getClassesFromDir($dir) {
    $before = get_declared_classes();
    $files = glob($dir . '/*.php');
    foreach ($files as $file) {
        require_once $file;
    }
    $after = get_declared_classes();
    return array_diff($after, $before);
}
print_r(getClassesFromDir('/path/to/classes'));
?>
  

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

Расширенные примеры и нестандартные подходы

Как динамически отслеживать загрузку классов через автозагрузку?

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

Пример

<?php
$loadedClasses = [];

spl_autoload_register(function ($className) use (&$loadedClasses) {
    $file = __DIR__ . '/classes/' . $className . '.php';
    if (file_exists($file)) {
        require $file;
        $loadedClasses[] = $className;
    }
});

new Foo();  // Предполагается, что класс Foo определён в /classes/Foo.php
new Bar();

print_r($loadedClasses);
?>
  
Array
(
    [0] => Foo
    [1] => Bar
)
  

Ошибка: если класс уже объявлен ранее, автозагрузка не вызовется. Метод подходит только для классов, загружаемых впервые.

Как использовать Composer для получения карты классов?

Composer генерирует файл vendor/composer/autoload_classmap.php, содержащий полный список классов из автозагрузки PSR-4 или classmap. Этот файл можно анализировать.

Пример

<?php
require __DIR__ . '/vendor/autoload.php';
$classMap = require __DIR__ . '/vendor/composer/autoload_classmap.php';
echo 'Всего классов в карте: ' . count($classMap) . "\n";
// Вывод первых пяти:
$keys = array_slice(array_keys($classMap), 0, 5);
foreach ($keys as $name) {
    echo $name . ' => ' . $classMap[$name] . "\n";
}
?>
  
Всего классов в карте: 42
App\Controller\Home => /var/www/src/Controller/Home.php
App\Controller\About => /var/www/src/Controller/About.php
...
  

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

Как найти все классы, объявленные в конкретном пространстве имён?

Сначала получаем все объявленные классы, затем фильтруем по префиксу пространства имён.

Пример

<?php
function getClassesInNamespace($namespace) {
    $prefix = rtrim($namespace, '\\') . '\\';
    $all = get_declared_classes();
    $filtered = [];
    foreach ($all as $class) {
        if (strpos($class, $prefix) === 0) {
            $filtered[] = $class;
        }
    }
    return $filtered;
}

// Пример: классы в пространстве App\Model
print_r(getClassesInNamespace('App\Model'));
?>
  
Array
(
    [0] => App\Model\User
    [1] => App\Model\Order
)
  

Ошибка: если классы из этого пространства ещё не загружены, результата не будет. Нужно предварительно их загрузить.

Как получить полный список загруженных интерфейсов и трейтов?

Аналогично get_declared_classes() существуют функции get_declared_interfaces() и get_declared_traits().

Пример

<?php
$interfaces = get_declared_interfaces();
$traits = get_declared_traits();
echo 'Интерфейсов: ' . count($interfaces) . ', трейтов: ' . count($traits);
?>
  
Интерфейсов: 23, трейтов: 5
  

Список классов PHP - comments

En
List php class (php)