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

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

$obj = new ArrayObject();

&

$obj = new ArrayObject();

когда я использовал первую строку, я получил ошибку:"Fatal error: Class 'FooBarArrayObject' not found..." и я не слишком уверен, почему я получил эту ошибку? Вторая линия, казалось, решила проблему.

1 ответов


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

$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), ведущая обратная косая черта не нужна и не рекомендуется, так как имена импорта должны быть полными и не обрабатываются относительно текущего пространства имен.