Синтаксис пространства имен PHP: в чем разница с брекетами и без брекетов?

PHP предлагает два синтаксиса для объявления пространств имен. Вы можете использовать пространство имен без привязок или с фигурными скобками, как показано ниже.

Без брекетов

namespace foo/bar;
class Any{}

С брекетами

namespace foo/bar {
   class Any{}
}

Есть ли разница в функциональности или поведении этих двух способов использования пространств имен или они работают/работают одинаково?

Ответ 1

Для каждого случая есть разные причины: хороший пример на сайте PHP.

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

Также, если в одном файле есть несколько пространств имен, также допускается синтаксис без привязки.

В соответствии с рекомендациями php это не рекомендуется, и если вы можете, просто сохраните его в одном пространстве имен для каждого файла.

Ответ 2

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

namespace {
    // code is in global scope
}

Помимо приведенного выше примера, потенциальным недостатком наличия нескольких пространств имен в одном файле является автозагрузчик, который использует имена каталогов и файлов для разрешения загрузки классов; поэтому не рекомендуется иметь более одного пространства имен для каждого файла, если вы не объединяете несколько файлов script в один.

Ответ 3

Как можно установить глобальное пространство имен без скобок?

<?php
declare(encoding='UTF-8');
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

namespace { // global code
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>

просто попробуйте написать этот код не в скобках

Ответ 4

Я думаю, что первый из них включает только класс "Любой". Но второй включает все классы между фигурными фигурными скобками.