Nie można zadeklarować interfejsu, ponieważ nazwa jest już używana


12

Po utworzeniu prostego interfejsu w moim nowym module. Wpisałem bin / magento setup: di: compile i pojawia się błąd informujący, że nazwa jest już używana.

Oto mój kod:

namespace Company\Test\Api;

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

Wtedy pojawia się ten błąd:

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

Linia to „interfejs XyzInterface”. Nie jestem pewien, co robię źle.


1
Czy możesz uruchomić polecenie z opcją -vvv, aby zobaczyć śledzenie stosu? Być może plik jest z jakiegoś powodu dołączony dwukrotnie.
BuskaMuza

Pokazuje tylko „Błąd krytyczny PHP”
Nelly,

Możesz także spróbować włączyć xdebug. Myślę, że powinno to pomóc w wyświetlaniu śladu wstecznego.
BuskaMuza

1
dostałem ten błąd również z powodu
niepoprawnie wpisanej

Odpowiedzi:


36

Dzisiaj otrzymałem błąd tego samego typu:

Błąd krytyczny PHP: Nie można zadeklarować klasy Klasa \ Nazwa \ Tutaj, ponieważ nazwa jest już używana w /var/www/m2/magento2/app/code/path/to/the/class.php w linii 100

gdzie linia 100 jest końcem pliku.

Mniej więcej po 4 godzinach debugowania naprawdę znajduję przyczynę: błędny wydruk w deklaracji przestrzeni nazw. Do ostatniej chwili nie wierzyłem, że jest to błąd typograficzny w deklaracji nazw, ale kiedy przepisałem wszystkie nazwy na nowo - błąd zniknął. Ten artykuł był bardzo pomocny:

Drapię się przez chwilę w głowę, zastanawiam się, co się dzieje, i ostatecznie zdaję sobie sprawę, że to jest to

Pulsetorm

tzn. źle wpisałem nazwę przestrzeni nazw, a kiedy początkowe autoloadowanie ładuje plik klasy, nie zdefiniowałoby klasy, której szuka, a następnie drugi autoloader (zwykle kompozytora) ładuje go ponownie i próbuje przedefiniować to samo niepoprawna klasa.

tj. Magento chciał klasy

Pulsestorm\Helloworld\Observers\Block

ale zdefiniowałem

Pulsetorm\Helloworld\Observers\Block

dzięki złej przestrzeni nazw.

Dziękuję, Alan Storm :)

AKTUALIZACJA:

Innym typem tego błędu jest niepoprawna deklaracja przestrzeni nazw z brakującą częścią przestrzeni nazw, jak w tym przykładzie:

Błąd:

Generowanie kodu repozytoriów ... 1/7 [====> -----------------------] 14% 1 s 50,0 MiBPHP Błąd krytyczny: Nie można zadeklarować klasa Migration \ Step \ Version11410to2000Test, ponieważ nazwa jest już używana w /var/www/vhosts/rwld/vendor/magento/data-migration-tool/tests/unit/testsuite/Migration/Step/UrlRewrite/Version11410to2000Test.php linia 109

gdzie linia 109 jest końcem pliku.

W pliku vendor/magento/data-migration-tool/tests/unit/testsuite/Migration/Step/UrlRewrite/Version11410to2000Test.phpznaleźliśmy przestrzeń nazw tak, jak Migration\Steppowinna być poprawna przestrzeń nazw, Migration\Step\UrlRewriteponieważ jest to ścieżka do tej klasy Migration/Step/UrlRewrite. Po zmianie przestrzeni nazw Migration/Step/UrlRewritena błąd zniknął.


1
Miałem ten sam problem, to szalony problem
Hamza Alayed

+1 za problem z przestrzenią nazw. Zmarnowałem 2 godziny. Wielkie dzięki!
wezzy

1
Również po prostu chcę to dodać, zachowaj szczególną ostrożność , nazywając swoje katalogi, ponieważ obudowa musi pasować - może to być także kolejne dwie godziny zmarnowane!
Smithee
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.