#Что означает ошибка
PHP Fatal error: Uncaught Error: Class "App\Models\User" not found
Fatal error: Uncaught Error: Class "App\Models\User" not found означает, что PHP не смог найти определение класса. Причины: не подключён автозагрузчик Composer, неверное пространство имён или регистр, файл лежит не там, где ожидает PSR-4, или кэш автозагрузки устарел.
На Linux имена файлов и классов чувствительны к регистру.
Проверьте автозагрузку и соответствие структуры.
PHP не нашёл класс: файл не подключён, неверно указано пространство имён, не обновлён автозагрузчик Composer или отличается регистр имени файла на Linux.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Не обновлён автозагрузчик Composer | Добавили новый класс. | Выполните composer dump-autoload. |
| Неверный namespace или use | Пространство имён не совпадает с путём. | Согласуйте namespace с PSR-4. |
| Регистр имени файла | Работает на Windows, не работает на Linux. | Приведите регистр в соответствие. |
| Файл не подключён | Нет require или autoload. | Подключите автозагрузчик. |
#Пошаговое решение
- Подключите vendor/autoload.phpВ журнале PHP найдите полное имя отсутствующего класса, имя файла и строку ошибки. Если проект использует Composer, в точке входа приложения найдите подключение
require __DIR__ . "/vendor/autoload.php";, адаптировав путь к реальному расположению. Убедитесь, что файл существует и доступен пользователю PHP-FPM; не подключайте автозагрузчик повторно во всех классах. - Выполните composer dump-autoloadОткройте терминал в корне проекта, где лежит
composer.json, и выполнитеcomposer dump-autoload -oпод учётной записью владельца проекта. Команда обновляет файлы автозагрузки, не загружая новые зависимости. Если отсутствует каталогvendor, после резервной копии и сверкиcomposer.lockустановите зависимости на стенде черезcomposer install --no-devс учётом требований проекта. - Сверьте namespace и путь к файлуВ
composer.jsonоткройте разделautoload.psr-4, найдите префикс пространства имён и сопоставьте его с каталогом и именем PHP-файла. Например,App\Service\Mailerдолжен иметь правильный namespace и совпадать по регистру с именем на диске; Linux различает прописные и строчные буквы. После исправления повторно выполнитеcomposer dump-autoload -o. - Проверьте use и обратную косую чертуПроверьте верх файла с обращением к классу: строку
use Полное\Имя\Класса;или запись с ведущим\для обращения из текущего namespace. Сравните полное имя в сообщении ошибки с объявлениемclass/interface/enum. Если класс переименован, исправьте импорты и сбросьте штатный кэш приложения или OPcache только по необходимости. - Для классов расширений проверьте php -mЕсли ошибка относится к встроенному классу расширения (
PDO,ZipArchive,Imagick), проверьте версию и модули именно веб-PHP, а не толькоphp -mв консоли: версия CLI может отличаться от PHP-FPM. Через временную закрытую диагностическую страницу или панель хостинга выясните список модулей; установку нужного расширения согласуйте с администратором и удалите диагностическую страницу после проверки. - Пересборка карты классовLinux · Терминал (Bash)КомандаПересборка карты классов.
composer dump-autoload
#Автозагрузка Composer
Подключите require __DIR__ . '/vendor/autoload.php'; один раз в точке входа. Обновите карту классов: composer dump-autoload -o. Установите зависимости: composer install. Проверьте раздел autoload в composer.json: "psr-4": {"App\\": "src/"}. После правки секции всегда выполняйте composer dump-autoload. Проверьте, загружена ли библиотека: composer show vendor/package.
#Пространства имён и файлы
Класс App\Models\User должен лежать в src/Models/User.php (для PSR-4 с префиксом App\ → src/) и иметь namespace App\Models;. Имя файла равно имени класса с тем же регистром: user.php не подойдёт на Linux. Проверьте use в файле и опечатки. Для классов PHP без пространства имён используйте обратную косую черту: \DateTime, иначе PHP ищет App\DateTime.
#Расширения и среда
Если не найден класс расширения (PDO, mysqli, ZipArchive, Redis), установите модуль: sudo apt install php8.3-mysql php8.3-zip и перезапустите PHP-FPM; проверьте php -m. На хостинге учитывайте разные версии PHP для CLI и веб. Включите отчёт об ошибках в разработке и проверьте, что деплой скопировал каталог vendor. Для автозагрузки без Composer используйте spl_autoload_register.
composer installcomposer dump-autoload -ophp -m | grep -i -E "pdo|mysqli|zip"