Невозможно объявить интерфейс, потому что имя уже используется

12

После создания простого интерфейса в моем новом модуле. Я набрал в bin / magento setup: di: compile, и я получаю сообщение об ошибке, говорящее, что имя уже используется.

Вот мой код:

namespace Company\Test\Api;

/*
 *  @api
 */
interface XyzInterface {
    public function getSomething();
}

Тогда я получаю эту ошибку:

Repositories code generation... 1/7 [====>-----------------------]  14% 2 secs 52.0 MiBPHP 
Fatal error:  Cannot declare interface Company\Test\Api\XyzInterface, because the name is already in use in .../app/code/Company/Test/Api/XyzInterface.php on line 13

Строка "интерфейс XyzInterface" Я не уверен, что я делаю неправильно.

Нелли
источник
1
Не могли бы вы выполнить команду с параметром -vvv, чтобы увидеть трассировку стека? Может быть, файл включен дважды по какой-то причине.
BuskaMuza
Это просто показывает «PHP Fatal Error»
Nelly
Вы также можете попробовать включить xdebug. Я думаю, что это должно помочь отображению следа.
BuskaMuza
1
я получил эту ошибку также из-за опечатки в классе «namespace»
Ansyori

Ответы:

36

Сегодня я получил ошибку того же типа:

Неустранимая ошибка PHP: невозможно объявить класс Class \ Name \ Here, поскольку имя уже используется в /var/www/m2/magento2/app/code/path/to/the/class.php в строке 100

где строка 100 является концом файла.

Примерно после 4 часов отладки я действительно нахожу причину: опечатка в объявлении пространства имен. До последнего момента я не верил, что это опечатка в объявлении имен, но когда я переписал все имена заново - ошибка исчезла. Эта статья была очень полезна:

Я почесываю голову на некоторое время, удивляюсь, что происходит, и в конце концов осознаю, что это

Pulsetorm

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

то есть, Magento хотел класс

Pulsestorm\Helloworld\Observers\Block

но я определил

Pulsetorm\Helloworld\Observers\Block

благодаря неправильному пространству имен.

Спасибо, Алан Сторм :)

ОБНОВИТЬ:

Другой тип этой ошибки - неправильное объявление пространства имен с отсутствующей частью пространства имен, как в этом примере:

Ошибка:

Генерация кода репозитория ... 1/7 [====> -----------------------] 14% 1 сек. 50,0 MiBPHP Фатальная ошибка: невозможно объявить Класс Migration \ Step \ Version11410to2000Test, поскольку имя уже используется в /var/www/vhosts/rwld/vendor/magento/data-migration-tool/tests/unit/testsuite/Migration/Step/UrlRewrite/Version11410to2000Test.php на линия 109

где строка 109 является концом файла.

В файле vendor/magento/data-migration-tool/tests/unit/testsuite/Migration/Step/UrlRewrite/Version11410to2000Test.phpмы нашли пространство имен, как Migration\Stepтогда, когда должно быть правильное пространство имен, Migration\Step\UrlRewriteпотому что путь к этому классу равен Migration/Step/UrlRewrite. После изменения пространства имен Migration/Step/UrlRewriteошибка исчезла.

Сергей Учухлебау
источник
1
У меня была такая же проблема, это сумасшедшая проблема
Хамза Alayed
+1 за проблему пространства имен. Я потратил 2 часа. Большое спасибо!
Wezzy
1
Также просто хочу добавить к этому, будьте особенно внимательны, когда называете свои каталоги, так как регистр должен совпадать - это также может быть потрачено впустую еще на два часа!
Смити