Подтвердить что ты не робот

Невозможно использовать X как Y, потому что имя уже используется, хотя оно не

Я использую PHP 5.4 и имею структуру класса PSR-0, похожую на следующую.

A\Library\session.php

namespace A\Library;

class Session { ... }

My\Application\session.php

namespace My\Application;

class Session { ... }

My\Application\Facebook.php

namespace My\Application;
use A\Library\Session;

class Facebook { ... }

Когда я пытаюсь запустить приложение, я получаю следующую ошибку:

Невозможно использовать A\Library\Session как сеанс, потому что имя уже используется в My\Application\Facebook.php

Даже если это не так, по крайней мере, в этом файле. Файл Facebook.php объявляет только класс Facebook и импортирует ровно один класс Session, A\Library один.

Единственная проблема, которую я вижу, заключается в том, что другой класс Session существует в том же пространстве имен, что и класс Facebook, но поскольку он никогда не был импортирован в файл Facebook.php, я думал, что это вообще не имеет значения.

Я ошибаюсь (в этом случае укажите соответствующую документацию), или это ошибка?

4b9b3361

Ответ 1

В PHP есть ошибка, которая может повлиять на поведение, которое вы видите. Предполагается, что это приведет к фатальной ошибке, но с включенным opcache он все равно может выполняться безупречно.

https://bugs.php.net/bug.php?id=66773

Если это все еще касается вас, проголосуйте за ошибку.

Ответ 2

Нет, это не ошибка. Как упоминалось в Использование пространств имен: Aliasing/Importing

использовать A\Library\Session;

совпадает с:

use A\Library\Session as Session;

Итак, попробуйте использовать что-то вроде:

use A\Library\Session as AnotherSessionClassName;

Ответ 3

Единственная проблема, которую я вижу, это то, что другой класс Session существует в такое же пространство имен как класс Facebook, но поскольку оно никогда не было импортировано в файл Facebook.php, я думал, что это вообще не имеет значения.

Да, это имеет значение. Вот почему вам не нужно "импортировать" классы из одного и того же пространства имен. Если у вас конфликтующие имена из разных пространств имен, вам нужно выполнить псевдоним класса.

namespace My\Application;
use A\Library\Session as ASession; // choose a proper alias name here

class Facebook { ... }

Ответ 4

Я читал ветку об этой проблеме, но я тестировал на многих версиях PHP (php 5.5, 5.6, 7. *, x32, x64, vc11, vc14, vc5). Я использую Laravel с Laragon. Но когда я собираю сервер с помощью php artisan serve (и открываю сервер по адресу http://localhost: 8000), у меня возникает проблема "пространства имен, которое уже было использовано некоторым классом" и прочего.

Я тестировал с расширением opcache и без него, и ничего не работает, затем я протестировал виртуальный домен, который предоставляет Laragon, и... вуаля, ошибка просто исчезла, и теперь я могу работать нормально. Я не знаю, что происходило, мои пространства имен были в порядке, у меня был псевдоним, но тот же код работает на многих машинах без проблем (AWS, local, prod, dev и т.д.), Но только на моей машине у меня возникла проблема Я описал это.

Итак, если кто-то работает с Laravel (5.1) и имеет эту проблему, попробуйте виртуальный хост Laragon.