Импорт классов и пространств имен в PHP: Какая разница делает лидирующую обратную косую черту?

В чем разница между этими двумя:

use Exception; use \Exception; 

Или те:

 use Foo\Bar; use \Foo\Bar; 

В руководстве написано:

Обратите внимание, что для имен с именами (полнофункциональные имена пространства имен, содержащие разделитель пространства имен, например Foo \ Bar, в отличие от глобальных имен, которые этого не делают, например FooBar), ведущая обратная косая черта не нужна и не разрешается, поскольку имена импорта должны быть полностью квалифицированными, и не обрабатываются относительно текущего пространства имен.

Но я этого не понимаю, так как все вышеперечисленные варианты работают, т. Е. Это определенно не «запрещено».

Взгляд на zend_do_use показал, что is_global (установлено, когда есть ведущая обратная косая черта) используется только для предупреждения в следующем случае:

 namespace { use Exception; } 

Что говорит мне: «Оператор использования с не-составным именем« Исключение »не имеет никакого эффекта». (Хотя делать то же самое с use \Exception было бы так же малоэффективно, но не бросать предупреждение.)

Итак: я что-то упустил? Есть ли какая-то разница?

Solutions Collecting From Web of "Импорт классов и пространств имен в PHP: Какая разница делает лидирующую обратную косую черту?"

В руководстве указано, что обратная косая черта не нужна , что, естественно, означает, что если вы все еще используете ее, то смысл эквивалентен. Однако, как вы уже указали, в руководстве говорится, что он предположительно не допускается, что неверно.

Однако в руководстве есть что-то еще. Они рекламируют это:

 // importing a global class use \ArrayObject; 

Если верно, что имена импорта не обрабатываются относительно текущего пространства имен, use \ArrayObject и use ArrayObject должно иметь то же значение. Что еще может use ArrayObject ссылок на другие, чем глобальные? На практике двигатель будет импортировать глобальный.

Кроме того, с ошибками, такими как: http://bugs.php.net/bug.php?id=49143

Я считаю, что существует путаница в том, что должен быть стандартом.

Чтобы ответить на ваш вопрос: нет никакой разницы. Тем не менее, если бы я был разработчиком движка, который также был сторонником стандартного стандарта без коллажа, тогда мне не нужно было бы рассматривать случай, когда кто-то писал use \Exception; , Я считаю, что это, вероятно, так.

На самом деле нет никакой разницы в использовании ведущей обратной косой черты при импорте пространств имен на данный момент, а также изменилась информация в руководстве по PHP :

Обратите внимание, что для имен с именами (полностью именуемые имена пространства имен, содержащие разделитель пространства имен, например Foo \ Bar, в отличие от глобальных имен, которые этого не делают, например FooBar), ведущая обратная косая черта не нужна и не рекомендуется , так как имена импорта должны быть полностью квалифицированными, и не обрабатываются относительно текущего пространства имен.

Итак, теперь есть настоящая информация о том, что использование обратного косая черта не рекомендуется, но нет информации о том, что она не разрешена в прошлом.

Итак, на данный момент:

 use Exception; use \Exception; 

эти 2 строки работают одинаково, но вы должны использовать первый.

Обычно ведущая обратная косая черта определяет, что идентификатор является абсолютным. Если он отсутствует, интерпретатор предполагает, что он является относительным идентификатором.

Это абсолютный идентификатор:

 $x = new \Name\Space\To\Class(); 

Это относительный идентификатор из-за отсутствия косой черты. Это относится к текущему пространству имен:

 namespace Name\Space; $x = new To\Class; 

Это также относительный идентификатор. В этом случае его разрешено против оператора use , потому что последняя часть (псевдоним) совпадает с первой из класса:

 namespace Other\Name\Space; use Name\Space; $x = new Space\To\Class; 

Однако, поскольку в операторах namespace и use допускаются только абсолютные идентификаторы (полные имена), можно опустить его здесь. В namespace даже не разрешено устанавливать ведущую обратную косую черту.

Для получения дополнительной информации о том, как PHP разрешает различные объявления пространств имен, см. Руководство по правилам пространства имен .

скажем, у нас есть

 namespace MyNamespace use Exception; use \Exception; 

то первое использование фактически импортирует класс MyNamespace \ Exception, а второй – только основной класс \ Exception

так что вы можете иметь что-то вроде

 namespace MyNamespace; class Exception extends \Exception{ } 

и тогда я могу

 throw new \Exception('Exception from global namespace'); throw new \MyNamespace\Exception('Exception from MyNamespace'); 

Ведущая обратная косая черта означает глобальное пространство имен. Если вы находитесь в области пространства имен, вы должны использовать это для достижения глобального пространства имен. Например:

 namespace A { class A { public function __construct() { echo('namespace: A<br />'); } } } namespace B\A { class A { public function __construct() { echo('namespace: B\\A<br />'); } } } namespace B { class B { public function __construct() { new \A\A(); // namespace: A new A\A(); // namespace: B\A } } new B(); } 

С ведущей обратной косой чертой вы получаете абсолютный путь, и без него вы получаете относительный путь.