Синтаксис пространства имен 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
Я думаю, что первый из них включает только класс "Любой". Но второй включает все классы между фигурными фигурными скобками.