Как использовать объекты из других пространств имен и как импортировать пространства имен в PHP

В чем основное различие между этими двумя линиями ?:

$obj = new ArrayObject(); 

&

 $obj = new \ArrayObject(); 

Когда я использовал первую строку, у меня возникла ошибка: "Fatal error: Class '\Foo\Bar\ArrayObject' not found..." и я не уверен, почему я получил эту ошибку? По-видимому, вторая проблема устранила проблему.

Если вы используете:

 $obj = new ArrayObject(); 

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

И если вы используете:

 $obj = new \ArrayObject(); 

это означает, что ArrayObject определяется в глобальном пространстве имен.

В вашем примере у вас, вероятно, есть код:

 namespace Foo\Bar; $obj = new ArrayObject(); 

Это не сработает, потому что вы не определили ArrayObject в пространстве имен Foo\Bar .

Вышеупомянутый код такой же, как:

 namespace Foo\Bar; $obj = new \Foo\Bar\ArrayObject(); 

И если ArrayObject определен в глобальном пространстве имен (возможно, в вашем случае), вам нужно использовать код:

 namespace Foo\Bar; $obj = new \ArrayObject(); 

подчеркнуть, что ArrayObject не определен в пространстве имен Foo\Bar ;

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

 namespace Foo\Bar; use ArrayObject; $obj = new ArrayObject(); 

Как вы видите, use ArrayObject; был добавлен перед созданием объекта для импорта ArrayObject из глобального пространства имен. Используя use вам не нужно добавлять (и вы не должны) добавлять ведущую обратную косую черту, но она работает так же, как и use \ArrayObject; поэтому над кодом эквивалентно логически:

 namespace Foo\Bar; use \ArrayObject; $obj = new ArrayObject(); 

однако, как я сказал, нельзя использовать обратную косую черту при импорте пространств имен. Процитировать руководство PHP для этого:

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