Пространства имен PHP: \ My \ Namespace или My \ Namespace? - PullRequest
7 голосов
/ 09 апреля 2011
  • My\Namespace
    • \My\Namespace

Итак, какой из них мне следует использовать, я вижу документацию php использует в основном My\Namespace.

Но говорят, что \My\Namespace лучше, потому что не является двусмысленным, тогда как My\Namespace может быть решен как \RandomNamespace\My\Namespace.

Я начал задумываться об этом после прочтения В Doctrine 2 есть проблема об этом : " Пожалуйста, замените" Doctrine \ XXX \ YYY "на" \ Doctrine \ XXX \ YYY " 'в коде и документе"

Итак, у вас есть больше информации об этом? Спасибо

Ответы [ 3 ]

4 голосов
/ 09 апреля 2011

Это ничем не отличается от использования относительных и абсолютных путей к файлам / URI и сводится к предпочтению. Однако, в отличие от абсолютных путей, я согласен с менее двусмысленным \My\Namespace, потому что он никогда не сломается там, где могли бы относительные пространства имен.

Псевдонимы пространства имен, с помощью use добавляют к краткости относительных имен пространства имен. Например, я могу сказать: use \PDO as YourMom, а затем позвонить YourMom в коде. Это \PDO, \YourMOM или YourMom, как его называют? Очевидно, что псевдоним побеждает и разрешается до \PDO, при условии, что нет никакого конфликта, но это затрудняет выполнение кода.

Редактировать

Пример кода, позволяющий доказать несостоятельность, возможен. Убедитесь, что вы видите глобальное отступление , примененное, если пространство имен неквалифицированное.

Как уже упоминалось @netcoder, невозможно быть двусмысленным во время объявления пространства имен. Таким образом, namespace My и namespace \My (или поменяйте местами любое другое объявление пространства имен ниже) на 100% идентичны, так как объявление полностью определяет пространство имен.

namespace My
{
}

namespace My\Other
{
    use Bob; // Resolves to \My\Other\Bob
}

namespace My\Other\NS
{
    use \My\Other as Other;
    use Other\NS as Duh; // This resolves to \My\Other\NS
}

namespace My\Other\Bob
{
    use Other\NS as Duh; // This resolves to \Other\NS becuase the namespace doesn't exist inside \My\Other\Bob
}
3 голосов
/ 09 апреля 2011

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

namespace My\Namespace;
// Is exactly the same as 
namespace \My\Namespace;

use Foo\Bar as Class1;
// Is exactly the same as 
use \Foo\Bar as Class2;

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

Если вы используете только классы из того же пространства имен и / или "объявляете" каждый класс в верхней части файла через use (и, возможно,as), вы можете безопасно использовать относительные идентификаторы классов.

2 голосов
/ 20 апреля 2011

На самом деле разница есть, но не всегда (ну, верно).

В конструкции use вам никогда не придется «упоминать» ведущую \. Встроенный вам никогда не придется, если класс находится в том же пространстве имен, или если вы используете импорт (импортированный с use ns).

Но иногда вы должны:

namespace foo;

class bar extends \baz\Bar {

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

Другой пример - классы без пространства имен, используемые в пространстве имен, встроенные:

namespace foo;

$dt = new \DateTime;

Рекомендуется импортировать ВСЕ классы, необходимые текущему файлу. Заявление об использовании очень, очень, очень, очень дешево, поэтому не сдерживайтесь.

namespace foo;

use baz\Bar AS OtherBar;
use \DateTime;

class Bar extends OtherBar { // or something like that; in this case (same class name) it's tricky
  function __construct() {
    $dt = new DateTime;

редактировать 1
Кроме того, не забывайте использовать полностью именованные имена классов при передаче их в виде строк, даже если вы находитесь в нужном пространстве имен:

namespace foo;

$class = 'foo\bar';
...