Список классов 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