Я использую 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, я думал, что это вообще не имеет значения.
Я ошибаюсь (в этом случае укажите соответствующую документацию), или это ошибка?
В PHP есть ошибка, которая может повлиять на поведение, которое вы видите. Предполагается фатальная ошибка, но с включенным opcache он все равно может выполняться безупречно.
https://bugs.php.net/bug.php?id=66773
Если это все еще касается вас, проголосуйте за ошибку.
Нет, это не ошибка. Как упоминалось в разделе «Использование пространств имен: слияние / импорт»
используйте A \ Library \ Session;
такой же как:
use A\Library\Session as Session;
Поэтому попробуйте использовать что-то вроде:
use A\Library\Session as AnotherSessionClassName;
Единственная проблема, которую я вижу, заключается в том, что другой класс Session существует в том же пространстве имен, что и класс Facebook, но поскольку он никогда не был импортирован в файл Facebook.php, я думал, что это вообще не имеет значения.
Да, это имеет значение. Вот почему вам не нужно «импортировать» классы из одного и того же пространства имен. Если у вас конфликтующие имена из разных пространств имен, вам нужно присвоить псевдоним классу.
namespace My\Application; use A\Library\Session as ASession; // choose a proper alias name here class Facebook { ... }