Класс Foo Bar Baz, расположенный в ./foo/bar/utility/baz.php не соответствует стандарту автоматической загрузки psr-4. Пропуск

#laravel #composer-php

#php #composer-php #автозагрузка

Вопрос:

При запуске composer update install , require , dump-autoload , и т. Д.; Я внезапно начинаю получать желтое уведомление об устаревании, в котором говорится:

Класс Foo Bar Baz, расположенный в ./foo/bar/utility/baz.php не соответствует стандарту автоматической загрузки psr-4. Пропуск.

До Composer 2.0 для получения:

Уведомление об устаревании: класс Foo Bar Baz, расположенный в ./foo/bar/Baz.php не соответствует стандарту автоматической загрузки psr-4. Он больше не будет автоматически загружаться в Composer версии 2.0. в phar:///usr/local/bin/composer/src/Composer/Autoload/ClassMapGenerator.php:201

Почему я получаю это уведомление или предупреждение? Что мне нужно, чтобы избавиться от него и подготовиться к Composer 2.0?

Ответ №1:

Это может произойти по целому ряду причин.

Важно обратить внимание на сообщение об ошибке, которое обычно очень точно указывает на источник проблемы.

Регистр пути

Наиболее распространенной причиной этого является то, что, как показано в сообщении об ошибке, регистр для разных компонентов имени пути для Bar.php do не совпадает с регистром для полного имени класса;

foo/bar/Baz.php не соответствует AppBarBaz .

Просто обновите свое приложение или пакет, чтобы каждый компонент path соответствовал регистру своего пространства имен, которое он содержит:

 FooBarBaz.php
  

Различия в имени файла и имени класса или пространстве имен

Очень тщательно сверьте путь с пространством имен. Иногда вы называете свой класс (или свое пространство имен) FooBar , но его путь на диске, например, «foo-bar». Или просто по какой-либо причине ваше пространство имен не полностью соответствует пути к файлам.

Это также вызовет уведомление / предупреждение. Вам нужно либо переименовать файлы, либо переименовать классы (или пространства имен).

Обычно изменить путь или файлы намного проще, поскольку изменение имен классов или пространств имен потребует от вас рефакторинга кода для соответствия новым именам, тогда как изменение путей не потребует от вас рефакторинга чего-либо.

Вложенные пространства имен и отсутствующее объявление

Допустим, у вас есть:

 "autoload": {
        "psr-4": {
            "Fizz\Buzz\": "src/"
        }
    },
  

И класс Dummy , определенный внутри src/Buzz :

 // src/Buzz/Dummy.php
namespace FizzBuzz

class Dummy {}
  

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

 // src/Buzz/Dummy.php
namespace FizzBuzzBuzz

class Dummy {}
  

Вам нужно будет внести изменения не только в соответствующий класс, но и в любой другой файл, в котором используется или импортируется этот класс. (например, путем объявления use FizzBuzzBuzzDummy; ).

Комментарии:

1. Я бы не согласился с тем, что сообщение об ошибке «обычно очень точно указывает на источник проблемы», если я что-то не упустил в этом сообщении об ошибке: класс VeterinaryOfficeIncludesSomeClass, расположенный в C:/xampp/htdocs/addons/VeterinaryOffice/IncludesSomeClass.php не соответствует стандарту автоматической загрузки psr-4. Пропуск. Сгенерированные оптимизированные файлы автоматической загрузки, содержащие 1 класс