Используйте фигурные скобки для структурирования кода в PHP
Можно ли заключить фрагменты кода в PHP в скобках (без использования фрагмента как функции)?
Будет ли следующий код вести себя так же, как и без фигурных скобок? Или могут возникнуть проблемы в зависимости от того, какой код используется внутри или вне скобок?
Например, будет ли это:
<?php
// First Code-Block
{# several lines of code
}
// Second Code-Block
{# another several lines of code
}
?>
Всегда вести себя так же, как это:
<?php
// First Code-Block
# several lines of code
// Second Code-Block
# another several lines of code
?>
Ответы
Ответ 1
Поведение кода PHP не изменяется, если вы заключите его в фигурные скобки. Однако вы не можете использовать некоторые инструкции PHP внутри фигурных скобок:
-
namespace
объявления;
- namespace
use
объявления для псевдонима или импорта любых имен;
- глобальные объявления
const
;
-
__halt_compiler()
.
Это означает, что будет работать следующий script:
<?php
const x = 5;
echo x;
но следующее не будет компилироваться:
<?php
{
const x = 5;
echo x;
}
Ответ 2
Да, но он не создаст новую локальную область. Это не то, что обычно было бы сделано. Обычно люди отмечают блоки с комментариями.
Update:
Потребовалось немного поиска, чтобы найти ссылку на него в руководстве, но вот оно:
http://www.php.net/manual/en/control-structures.intro.php
Любой PHP script построен из ряда операторов. Оператором может быть назначение, вызов функции, цикл, условный оператор или даже оператор, который ничего не делает (пустой оператор). Заявления обычно заканчиваются точкой с запятой. Кроме того, операторы могут быть сгруппированы в группу операторов путем инкапсуляции группы операторов с фигурными фигурными скобками. Группа заявлений сама по себе является выражением. Различные типы операторов описаны в этой главе.
Ключевым здесь является , операторы могут быть сгруппированы в группу-оператор путем инкапсуляции группы операторов с фигурными фигурными скобками.
Я также искал ссылку на область видимости переменной, поскольку это относится к этой ситуации, но в руководстве конкретно не упоминается, однако вы можете думать о это примерно так:
В PHP функции и классы создают область переменной. Вы можете прочитать об этом здесь. Но группа заявлений (как описано выше) не делает. Не думайте о фигурных скобках группы-оператора, таких как скобки-скобки функции (или класса), но думайте о них как фигурные скобки, которые обертывают группу-оператор-структуру структур управления (if
, for
, while
, switch
и т.д.) - потому что это именно то, что они есть. Ясно, что если вы используете оператор if
(или любую другую структуру управления), в которой фигурные скобки не вводят новую область, они просто являются оболочками для блока операторов.
Ответ 3
В одном проекте, над которым я работаю, я использую группы операторов для указания структуры. В моем случае отношения родителя/ребенка между узлами создают в маршрутизаторе:
$router = new Router();
$admin = $router->route('admin');
{
$upload = $admin->route('upload')->post('upload');
$menu = $admin->route('menu');
{
$menu->route('load')->get('load');
$menu->route('save')->get('save');
}
}
`` `
Внутренне это создает иерархическую структуру, например:
/admin
/upload
/menu
/load
/save
Вызов route()
в этом примере создает дочерний элемент - поэтому код создает модель (внутри маршрутизатора), которая имеет древовидную структуру, но структура кода не отражает этого.
Я использую фигурные скобки здесь, чтобы сделать код более понятным, так как чтение кода без фигурных скобок и отступов было бы довольно сложным:
$router = new Router();
$admin = $router->route('admin');
$upload = $admin->route('upload')->post('upload');
$menu = $admin->route('menu');
$menu->route('load')->get('load');
$menu->route('save')->get('save');
Отступ в этом случае действительно разъясняет, что происходит, я думаю.
Ответ 4
Я также делаю это исключительно из-за моего текстового редактора (Komodo Edit 8.5). Это не "плохая причина" или "плохое кодирование", если это помогает вам и не вызывает никаких проблем, и если нет другого простого способа сделать это.
Я решаю проблему с обходом:
if(1 == 1){ //always executing if function
//whatever you want to add
}
#
Добавление # в конец не позволяет моему редактору свернуть все пустые строки ниже фигурных скобок. Это помогает еще больше структурировать код.