Невозможно использовать 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, я думал, что это вообще не имеет значения.
Я ошибаюсь (в этом случае укажите соответствующую документацию), или это ошибка?
Ответы
Ответ 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.